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 中的交互器?

将 textview 的内容传递给邮件正文

如何将 View 参数(TextView)从 OnClickListener 传递给公共方法

将JSON对象响应传递给TextView以进行测试时出错

将 Ajax 调用中的日期值传递给 MVC

将字典值作为空值传递给 alamofire 服务 ios swift