将视图控制器导入另一个控制器进行segueing是否安全?

时间:2014-01-23 18:37:39

标签: ios objective-c segue viewcontroller

我目前正在浏览iTunes U Stanford iOS开发。当然,我正在尝试利用segues。

在我的prepareForSegue方法中,我正在尝试更新转换VC上的数据,这是我的代码:

    -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
     {
        if([segue.identifier isEqualToString:@"changeToScreen2"])
         {
             if([segue.destinationViewController isKindOfClass:[Screen2ViewController class]])
                {
                    "Code to be implemented"
                }
         }
     }

但我的Screen2ViewController无法识别。是否安全和正确的编码技术将视图控制器导入到另一个视图控制器以实现隔离目的,还是我应该实现另一种方法?

----------------------------------------------- --------------------------------------

我现在遇到了一个新问题

当我使用前面提到的prepareForSegue方法设置UILabel和UITextView的值并更改为Screen2ViewController时,标签和文本视图没有使用我添加的值进行更新。

    Screen2ViewController *S2VC = (Screen2ViewController *)segue.destinationViewController;
    S2VC.myLabel.text = @"Screen 2 is now being viewed";
        S2VC.uneditableText.text = @"Why aren't you showing up when I push you";

但这些值不会更新。

2 个答案:

答案 0 :(得分:2)

是的,导入视图控制器是安全的。但是,有一些警告,

不要将2个标头相互导入,这会导致非明显的错误。

Screen1ViewController.h
#import "Screen2ViewController.h"

Screen2ViewController.h
#import "Screen1ViewController.h"

导入.m文件

Screen1ViewController.h
#import "Screen2ViewController.h"

Screen2ViewController.h
//No imports
Screen2ViewController.m

#import "Screen1ViewController.h"

作为一般规则,我尝试将所有导入放在.m文件中:既用于封装又用于上述原因。如果需要在两个头文件中同时使用这两个类,也可以声明一个类。

答案 1 :(得分:0)

关于您的新问题:如果实例已公开,则只能更新其他视图控制器中的实例(换句话说,它们已在其头文件中声明)。因此,使用提供的代码,您需要公开myLabeluneditableText。但是,在prepareForSegue:执行期间,它们尚未分配。由于您需要从这些对象中编辑他们的text,最好在第二个视图控制器中定义两个NSString,然后在VC的实现中将它们分配给对象。例如:

第一视图控制器

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
     {
        if([segue.identifier isEqualToString:@"changeToScreen2"])
         {
             if([segue.destinationViewController isKindOfClass:[Screen2ViewController class]])
                {
                    Screen2ViewController *S2VC = (Screen2ViewController *)segue.destinationViewController;
                    S2VC.labelText = @"Screen 2 is now being viewed";
                    S2VC.textViewText = @"Why aren't you showing up when I push you";
                }
         }
     }

第二视图控制器的标题

...
@property (nonatomic, strong) NSString *labelText;
@property (nonatomic, strong) NSString *textViewText;
...

第二视图控制器的实施文件

...
- (void)viewDidLoad
{
     [super viewDidLoad];
     self.myLabel.text = self.labelText;
     self.uneditableText.text = self.textViewText;
}
...

毋庸置疑,您之前必须使用Interface Builder将myLabeluneditableText添加为第二视图控制器的@property