Xcode / Obj-c - Segue推动新实例

时间:2013-05-17 09:33:07

标签: iphone ios objective-c xcode

我在Stackoverflow上看到了很多类似的问题,我尝试了很多东西,但我似乎无法解决这个问题。我有多个TableViewControllers和1个​​MainViewController。 MainViewController具有调用不同TableViewControllers的按钮,并且在选择tableViewController时忽略的tablecell。

问题是我每次从任何一个tableViewControllers推送时都会推送一个新的MainViewController实例。我目前使用Segues在这些不同的控制器之间推送。

简而言之:当从TableViewControllers切换到ViewController时,我希望阻止ViewController作为新实例被推送,因为这样就可以删除我以前的数据输入。

我很确定我必须使用:

[self dismissModalViewController: withCompletion:]
performSegue
prepareForSegue

或者在类中设置一些全局变量并调用它们,但我还没有足够的经验来正确实现它。

最终结果的一个简单示例是:VC中的3个文本字段。在单击textfield1时,它会打开tableview1,并在单击一个单元格时更新textfield1。 Textfield2打开tableview2等。

希望我足够清楚,如果需要可以发布示例代码。

编辑,发布代码(请记住,segues是在storyboard中执行的): TableViewExample.h:

@interface IndustryViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

NSArray *tableViewArray;}
@property (nonatomic, strong) IBOutlet UITableView *tableViewIndustry;

TableViewExample.m:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"showIndustry"]) {
    NSIndexPath *indexPath = [self.tableViewIndustry indexPathForSelectedRow];
    ViewController *destViewController = segue.destinationViewController;
    destViewController.industryText = [tableViewArray objectAtIndex:indexPath.row];
    destViewController.industryTextName = [tableViewArray objectAtIndex:indexPath.row];
}}

然后在ViewController.m中,viewDidLoad:

 [industry setTitle:industryText forState:UIControlStateNormal];

这些是我认为最重要的部分。

1 个答案:

答案 0 :(得分:1)

“Push”类型的segue?如果是这样,您应该尝试使用以下方法解除表视图控制器:

[self.navigationController popViewControllerAnimated:YES];

如果segue的类型为“Modal”,您应该在表视图控制器上执行类似的操作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // your logic here
    [self dismissModalViewControllerAnimated:YES];
}

至于控制器之间的数据交换,我个人会做的是在Table View Controller的头文件中创建一个公共属性,如下所示:

@property (nonatomic, weak) <Your_UIViewController_Subclass_Here> *mainController

在主控制器中,覆盖prepareForSegue:sender:方法,将新创建的属性设置为指向主控制器,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   <Your_Subclass_Of_UITableViewController_Here> *destinationController = segue.destinationController;
   destinationController.mainController = self;
}

现在,表视图控制器将有一个指向主控制器的指针来发送数据,基本上你只需要在用户选择表视图行时在主控制器中实现一些公共方法或属性。表视图控制器,以便更新文本字段中的文本或您正在使用的任何数据模型。