回答:
テキストフィールドデリゲートを使用して、メソッドがあります
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
これからNOを返し、ユーザーがテキストを編集しようとしても拒否されます。
そうすれば、フィールドを有効のままにしておいても、テキストがフィールドに貼り付けられるのを防ぐことができます。
ニックの答えを迅速に翻訳します。
P / S:falseを返す=>テキストフィールドは入力できず、キーボードで編集できません。コードでテキストを設定できるだけです。EX:textField.text = "My String Here"
override func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return false
}
これは、最も簡単な方法です。
in viewDidLoad :(編集不可のテキストフィールドのみにデリゲートを設定します。
self.textfield.delegate=self;
このデリゲート関数を挿入します:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return NO;
}
それでおしまい!
UIPickerView
そのデリゲートメソッドから動作をトリガーすると、うまく機能します。
Swift 3+の場合:
class MyViewController: UIViewController, UITextFieldDelegate {
override func viewDidLoad() {
self.myTextField.delegate = self
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
if textField == myTextField {
// code which you want to execute when the user touch myTextField
}
return false
}
}
のカスタムサブクラスを作成するために、よりエレガントになるUITextField
ことリターンをNO
へのすべての呼び出しのためにcanPerformAction:withSender:
(あるいは少なくともどこaction
である@selector(cut)
か@selector(paste)
説明するように、)ここに。
さらに、Bluetoothキーボードからのテキスト入力を無効にするために、ニックの提案に従って-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)stringも実装します。
canPerformAction
とshouldChangeCharactersInRange
メソッドは呼び出されません。
MrMageが提供するソリューションを使用しました。追加する唯一のことは、UITextViewを最初のレスポンダーとして辞任する必要があることです。
これが私の迅速なコードです:
class TouchableTextView : UITextView {
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
self.resignFirstResponder()
return false
}
override func shouldChangeTextInRange(range: UITextRange, replacementText text: String) -> Bool {
self.resignFirstResponder()
return false
}
}
UIPickerViewとアクションシートを処理する別の方法については、ActionSheetPickerをチェックアウトしてください
https://github.com/TimCinel/ActionSheetPicker
cocoapods対応です。アクションシートのすべてのキャンセルボタンと完了ボタンを処理します。サンプルプロジェクト内の例はすばらしいです。私は、文字列ベースのオプションだけを簡単に処理するActionSheetStringPickerを選択しますが、APIは私が考えることができるほとんどすべてのものを処理できます。
チェックマークの付いた回答のようなソリューションを最初に開始しましたが、このプロジェクトに出くわし、ココポッドの使用を含む使用のためにアプリに統合するために約20分かかりました:ActionSheetPicker(〜> 0.0)
お役に立てれば。
gitプロジェクトをダウンロードして、次のクラスを見てください。
ここに、私が追加したコードの大部分と、*。hのインポートがあります。
- (IBAction)gymTouched:(id)sender {
NSLog(@"gym touched");
[ActionSheetStringPicker showPickerWithTitle:@"Select a Gym" rows:self.locations initialSelection:self.selectedIndex target:self successAction:@selector(gymWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender];
}
- (void)actionPickerCancelled:(id)sender {
NSLog(@"Delegate has been informed that ActionSheetPicker was cancelled");
}
- (void)gymWasSelected:(NSNumber *)selectedIndex element:(id)element {
self.selectedIndex = [selectedIndex intValue];
//may have originated from textField or barButtonItem, use an IBOutlet instead of element
self.txtGym.text = [self.locations objectAtIndex:self.selectedIndex];
}
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
return NO; // Hide both keyboard and blinking cursor.
}
値を選択するためにUIPickerViewを使用しているときにUITextFieldが編集されないようにするには(Swift):
self.txtTransDate = self.makeTextField(self.transDate, placeHolder: "Specify Date")
self.txtTransDate?.addTarget(self, action: "txtTransDateEditing:", forControlEvents: UIControlEvents.EditingDidBegin)
func makeTextField(text: String?, placeHolder: String) -> UITextField {
var textField = UITextField(frame: CGRect(x: 140, y: 0, width: 220.00, height: 40.00));
textField.placeholder = placeHolder
textField.text = text
textField.borderStyle = UITextBorderStyle.Line
textField.secureTextEntry = false;
textField.delegate = self
return textField
}
func txtTransDateEditing(sender: UITextField) {
var datePickerView:UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = UIDatePickerMode.Date
sender.inputView = datePickerView
datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
}
func datePickerValueChanged(sender: UIDatePicker) {
var dateformatter = NSDateFormatter()
dateformatter.dateStyle = NSDateFormatterStyle.MediumStyle
self.txtTransDate!.text = dateformatter.stringFromDate(sender.date)
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
self.resignFirstResponder()
return false
}
この回避策は機能します。テキストフィールドの上に透明なUIViewを配置し、次のコードを実装します。
- (void)viewDidLoad
{
[super viewDidLoad];
UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress)];
[transparentView addGestureRecognizer:press];
[press release];
press = nil;
}
-(void)longPress
{
txtField.userInteractionEnabled = NO;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
txtField.userInteractionEnabled = YES;
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[txtField becomeFirstResponder];
}
これは私[textview setEditable:NO];
のために働きました
上記の答えは状況を複雑にしています。