Swift - 将字符串从 VC1 传递到 VC2 - 崩溃

Posted

技术标签:

【中文标题】Swift - 将字符串从 VC1 传递到 VC2 - 崩溃【英文标题】:Swift - Passing a string from VC1 to VC2 - Crash 【发布时间】:2014-07-11 08:12:21 【问题描述】:

我有一个 swift 应用程序,我只是想将字符串从一个 ViewController 传递到另一个。在segue之后,我看到第二个viewController在第一个之上,数据通过了,我得到了以下异常:

2014-07-11 10:58:17.078 Flipper[8967:377257] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_TtC7Flipper19FirstViewController textField:]: unrecognized selector sent to instance 0x7fba2351eda0'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010c805055 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010e528a1c objc_exception_throw + 45
    2   CoreFoundation                      0x000000010c80bf1d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010c764dbc ___forwarding___ + 988
    4   CoreFoundation                      0x000000010c764958 _CF_forwarding_prep_0 + 120
    5   UIKit                               0x000000010d2ed196 -[UIApplication sendAction:to:from:forEvent:] + 75
    6   UIKit                               0x000000010d3f1c80 -[UIControl _sendActionsForEvents:withEvent:] + 467
    7   UIKit                               0x000000010d9fbb86 -[UITextField _resignFirstResponder] + 256
    8   UIKit                               0x000000010d45cbff -[UIResponder resignFirstResponder] + 117
    9   UIKit                               0x000000010d9fb98f -[UITextField resignFirstResponder] + 114
    10  UIKit                               0x000000010d355722 -[UIView(Hierarchy) _removeFirstResponderFromSubtree] + 161
    11  UIKit                               0x000000010d355bdd __UIViewWillBeRemovedFromSuperview + 76
    12  UIKit                               0x000000010d35594c -[UIView(Hierarchy) removeFromSuperview] + 91
    13  UIKit                               0x000000010d3ef12c __71-[UIPresentationController _initViewHierarchyForPresentationSuperview:]_block_invoke478 + 785
    14  UIKit                               0x000000010d3eb7bd -[UIPresentationController transitionDidFinish:] + 87
    15  UIKit                               0x000000010d3edd8e __56-[UIPresentationController runTransitionForCurrentState]_block_invoke_2 + 133
    16  UIKit                               0x000000010da1d123 -[_UIViewControllerTransitionContext completeTransition:] + 110
    17  UIKit                               0x000000010d3e8ea3 -[UITransitionView _didCompleteTransition:] + 1120
    18  UIKit                               0x000000010d34542a -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 209
    19  UIKit                               0x000000010d345760 -[UIViewAnimationState animationDidStop:finished:] + 76
    20  QuartzCore                          0x000000010d176f9e _ZN2CA5Layer23run_animation_callbacksEPv + 308
    21  libdispatch.dylib                   0x000000010ea64d64 _dispatch_client_callout + 8
    22  libdispatch.dylib                   0x000000010ea50f82 _dispatch_main_queue_callback_4CF + 941
    23  CoreFoundation                      0x000000010c76dae9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    24  CoreFoundation                      0x000000010c73046b __CFRunLoopRun + 2043
    25  CoreFoundation                      0x000000010c72fa06 CFRunLoopRunSpecific + 470
    26  GraphicsServices                    0x00000001103b9abf GSEventRunModal + 161
    27  UIKit                               0x000000010d2ebcf8 UIApplicationMain + 1282
    28  Flipper                             0x000000010c37737d top_level_code + 77
    29  Flipper                             0x000000010c3773ba main + 42
    30  libdyld.dylib                       0x000000010ea99145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我的 VC1 代码是:

class FirstViewController: UIViewController 

    @IBOutlet var textField: UITextField
    var myVariable:String!

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) 
        if (segue.identifier == "P1ToP2") 
            var svc = segue!.destinationViewController as SecondViewController;
            myVariable = textField.text
            svc.myVariable = myVariable
        
    

我的 VC2 代码是:

class SecondViewController: UIViewController 

    @IBOutlet var labelTwo: UILabel
    var myVariable:String!

    override func viewDidLoad() 
        super.viewDidLoad()  
        labelTwo.text = myVariable
        

我正在使用一个故事板,其中 VC1 有一个按钮,它调用称为 P1ToP2 的显示(推送)segue

任何想法我做错了什么?谢谢

【问题讨论】:

这就是VC2的全部代码吗? 是的。这当然是一个测试应用......只是学习。 你让我思考。 VC2 中没有额外的代码,但故事板中列出了一个 IBAction。删除解决了问题..所以谢谢.. +1 【参考方案1】:

正如您的崩溃所说: reason: '-[_TtC7Flipper19FirstViewController textField:]: unrecognized selector sent to instance 而且您还没有提到单击按钮时会发生崩溃。

我的猜测是尝试删除textField:UITextField 之间的空格。

我猜问题出在那儿,而不是传递字符串。

【讨论】:

你怎么知道点击按钮导致了崩溃? 我不是在说,我是在证明他没有提到这一点。 您好,感谢您的回答。不幸的是,它不能解决问题。至于单击按钮,之后,正如我所说,我看到了第二个 VC - 它覆盖在第一个上。然后发生崩溃.. +1 尝试:) 这绝对与使用textField有关。如果我在两个 VC 中删除对它的引用,则不会再次发生崩溃。 @DavidDelMonte 如果 label.text 也产生相同的错误,您应该尝试使用一次标签。那么它必须是 textField.text 中的内容。

以上是关于Swift - 将字符串从 VC1 传递到 VC2 - 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 中的“UserDefaults”更新值的问题

如何在没有 segue 和 storyboard 编程的情况下传递数据?

将值从 VC1 传递到 VC2

Swift 中视图控制器之间的基本转换

如何在swift中删除行后刷新tableview?

在 Swift 中以编程方式制作 Segue