【问题标题】:iOS take textview value to alertController.textFields. in alert controller blockiOS 将 textview 值传递给 alertController.textFields。在警报控制器块中
【发布时间】: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 值以供文本字段使用?

【问题讨论】:

    标签: ios objective-c objective-c-blocks


    【解决方案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”,它可能会修复。 stackoverflow.com/questions/14877415/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-22
        • 2016-02-09
        • 1970-01-01
        相关资源
        最近更新 更多