如何通过3个ViewControllers传递NSString?

时间:2010-05-03 22:00:05

标签: iphone objective-c sdk nsstring

嘿,我目前正在使用iPhone SDK,我在通过3个视图传递NSString时遇到了麻烦

我能够在两个视图控制器之间传递一个NSString,但是我无法通过另一个传递它。我的代码如下......

    `- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)index`Path {

 NSString *string1 = nil;

 NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
 NSArray *array = [dictionary objectForKey:@"items"];
 string1 = [array objectAtIndex:indexPath.row];


 //Initialize the detail view controller and display it.
 ViewController2 *vc2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:[NSBundle mainBundle]];
 vc2.string1 = string1;
 [self.navigationController pushViewController:vc2 animated:YES];
 [vc2 release];
 vc2 = nil;
}

在“ViewController 2”实现中,我可以通过执行以下操作在标题栏中使用“string1”....

    - (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = string1;
 UIBarButtonItem *addButton = [[[UIBarButtonItem alloc]
           initWithImage:[UIImage imageNamed:@"icon_time.png"] 
           style:UIBarButtonItemStylePlain
           //style:UIBarButtonItemStyleBordered
           target:self
           action:@selector(goToThirdView)] autorelease];
 self.navigationItem.rightBarButtonItem = addButton;

    }

但我在右侧还有一个NavBar按钮,我想推送一个新视图

- (void)goToThirdView 
    { 
     ViewController3 *vc3 = [[ViewController3 alloc] initWithNibName:@"ViewController3" bundle:[NSBundle mainBundle]];

     [self.navigationController pushViewController:NESW animated:YES];
     vc3.string1 = string1 ;
     [vc3 release];
     vc3 = nil;
}

如何将相同的字符串传递给第三个视图? (或第四)

2 个答案:

答案 0 :(得分:1)

除了要在vc3中设置字符串,然后将其推入堆栈以确保在视图和导航栏绘制时它存在时,您应该使用的内容。这就是你在vc2中运行它的方式。

但是,作为应用程序设计的问题,在视图控制器之间直接传递值是不好的做法。理想情况下,您希望视图控制器是独立的,并且无论其他控制器在其之前执行或未执行,都能够运行。 (当您需要将应用程序恢复到中断点时,这变得非常重要。)如果使视图控制器相互依赖,则随着应用程序变大,应用程序将变得纠结和复杂。

在视图之间交换数据的最佳方法是将数据停放在普遍可访问的位置。如果它是应用程序状态信息,则将其置于用户默认值中,或者您可以放入应用程序委托的属性。如果它是用户数据,那么它应该进入专用数据模型对象(可以是单例或通过应用程序委托访问。)

答案 1 :(得分:0)

您可以找到我之前提到过的question代码示例。