iOS 将 textview 值传递给 alertController.textFields。在警报控制器块中
Posted
技术标签:
【中文标题】iOS 将 textview 值传递给 alertController.textFields。在警报控制器块中【英文标题】:iOS take textview value to alertController.textFields. in alert controller block 【发布时间】:2017-05-12 01:56:39 【问题描述】:如何将 textview 值传递给 alertController textFields 块?
我有 textview 组件调用“myTextView”
@property (weak, nonatomic) IBOutlet UITextView *myTextView
我在下面设置了警报控制器:
myAlertController = [UIAlertController alertControllerWithTitle:@"title" message:@"pass the value in alertcontroller" preferredStyle: UIAlertControllerStyleAlert];
myAlertControllerOKAction = [UIAlertAction actionWithTitle:@"sure" style:UIAlertActionStyleDefault
handler:nil];
[myAlertController addTextFieldWithConfigurationHandler:^(UITextField *textField)
textField.keyboardType = UIKeyboardTypeDefault;
textField.text = [self.myTextView.text stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
];
[myAlertController addAction: myAlertControllerOKAction];
但我在 myAlertController 块中设置了 myTextView.text,
textField.text = [self.myTextView.text stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
];
它会显示
在此块中强烈捕获“自我”可能会导致保留周期
如何获取警报控制器块中的 textview 值以供文本字段使用?
【问题讨论】:
【参考方案1】:在块中使用弱self
:
__weak typeof(self) weakSelf = self;
[myAlertController addTextFieldWithConfigurationHandler:^(UITextField *textField)
textField.keyboardType = UIKeyboardTypeDefault;
textField.text = [weakSelf.myTextView.text stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
];
如果在块中使用强self
,可能会导致self
无法释放。
Always pass weak reference of self into block in ARC?
【讨论】:
我跟踪块中的weakSelf.myTextView.text,它会显示nil。你知道为什么吗? @dickfala 你是初始化myTextView
还是给它赋值?
嗨,myTextView 来自 IBOutlet UITextView *myTextView,我有一些关键词,然后单击按钮显示 myAlertController,我需要将 myTextView 内容传递给 myAlertController addTextFieldWithConfigurationHandler 块。但我无法使用 __weak typeof(self) weakSelf = self;
我不知道为什么我在文本视图中键入一些单词,文本视图(调用 myTextView)是标题属性中的 IBOutlet。然后我点击一个按钮来显示警报,警报有文本字段,我想在警报文本字段上显示 myTextView 内容。但是我不知道为什么我在关于警报控制器的 addTextFieldWithConfigurationHandler 块中得到了 nil。
@dickfala 我创建了一个项目Github TestAlertController,它对我来说很好用。你可以下载它看看有什么不同。【参考方案2】:
像这样在块外创建一个“自我”的弱变量:
斯威夫特 3:
weak var w_self = self
目标-C:
__weak MyObject *weakSelf = self;
然后在块中使用这个而不是“self”。
【讨论】:
【参考方案3】:就像其他人指出的那样,在 Swift 或 ObjC 中,您可以创建一个对象的 weak
引用以避免闭包内的强保留循环。
对象:
__weak typeof(self) weakSelf = self;
[myAlertController addTextFieldWithConfigurationHandler:^(UITextField *textField)
textField.keyboardType = UIKeyboardTypeDefault;
textField.text = [weakSelf.myTextView.text stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
];
斯威夫特weak
:
myAlertController.addTextField(configurationHandler: [weak self] (textField : UITextField!) -> Void in
// Notice the guard to make sure myTextView is unwrapped
guard let weakTextView = weak.myTextView,
let weakText = weakTextView.text,
weakText.characters.count > 0 else
return
textField.keyboardType .default
textField.text = weakText.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
)
斯威夫特unowned
:
myAlertController.addTextField(configurationHandler: [unowned self] (textField : UITextField!) -> Void in
// Notice the use of unowned, unlike weak, unowned does not have to be unwrapped to avoid nil
textField.keyboardType .default
textField.text = unowned.weakTextView.text.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
)
在unowned
的示例中,注意到我没有像处理弱引用那样打开我的unowned
引用。这是因为unowned
不是可选的,并且在使用unowned
时我们不会冒遇到nil
的风险。我个人更喜欢使用unowned
。
【讨论】:
【参考方案4】:在访问块内的myTextView
之前,您需要创建对 self 的弱引用:
...
__weak __typeof(self) weakSelf = self;
[myAlertController addTextFieldWithConfigurationHandler:^(UITextField *textField)
textField.keyboardType = UIKeyboardTypeDefault;
textField.text = [weakSelf.myTextView.text stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
];
...
【讨论】:
我尝试添加weakSelf,发现在addTextFieldWithConfigurationHandler 块中无法获取textview 文本内容。你知道如何解决吗?谢谢。 我在addTextFieldWithConfigurationHandler块中追踪weakSelf.myTextView.text,它会得到nil值。 我将“typeof”更改为“__typeof”,它可能会修复。 ***.com/questions/14877415/…以上是关于iOS 将 textview 值传递给 alertController.textFields。在警报控制器块中的主要内容,如果未能解决你的问题,请参考以下文章
如何将 IBOutlet 值从视图传递到 VIPER iOs 中的交互器?