2012-12-27 45 views
2

我对iOS编程比较陌生,所以请在这里与我联系。我工作的要求如下:如何将变量从UIViewController传递给委托UITableViewController

画面1:用户显示加载数据,特别是城市和国家一个UITableView。用户点击选择和被取为屏幕2.

屏幕2 :用户显示他们选择要编辑的项目的“详细”视图。

  • 市字符串(selectedCity)被放置在一个文本框中编辑
  • 国的一个NSArray装入一个UITableView。应根据从屏幕1传递的字符串(selectedState)在装载的表格中选择所选城市的状态。如果需要,用户可以在这里选择不同的状态。
  • 第二个UITableView将包含与城市相关的一系列学校,并从数据库中检索。管理这个列表有一套独立的功能。

我还没有实现屏幕1.以下是我经过的城市和州值屏幕2的任何问题:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    //Get the City 
    self.checkedCellIndex = indexPath.row; 
    FSCity *selectedCity = [CityList objectAtIndex:indexPath.row]; 
    NSString *cityName = selectedCity.name; 
    NSString *stateName = selectedCity.state; 

    AdminCityView *dvController = [[AdminCityView alloc] initWithNibName:@"AdminCityView" bundle:[NSBundle mainBundle]]; 
    dvController.selectedCity = cityName; 
    dvController.selectedState = stateName; 

    [self.navigationController pushViewController:dvController animated:YES]; 

    dvController = nil; 
} 

为了打造国际网2,但是,我有以创建每个的UITableView(StateTable和SchoolTable)UITableViewControllers以及向主的UIViewController(AdminCityView)加载它们,就像这样:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    txtCity.text = selectedCity; 

    if (stateController == nil) { 
     stateController = [[StateTable alloc] init]; 
    } 
    if (schoolController == nil) { 
     schoolController = [[SchoolTable alloc] init]; 
    } 
    [tblState setDataSource:stateController]; 
    [tblSchool setDataSource:schoolController]; 

    [tblState setDelegate:stateController]; 
    [tblSchool setDelegate:schoolController]; 
    stateController.view = stateController.tableView; 
    schoolController.view = schoolController.tableView; 
} 

虽然我可以在得到selectedState变量很好,在我的UIViewController和我的状态表加载在UIView罚款,我坚持如何将selectedState变量从我的UIViewController(AdminCityView)传递给UITableViewController(StateTable),以便我可以在StateTable上执行操作该变量(如选择与变量匹配的行)。

我一直在使用NSLog在AdminCityView和StateTable上进行测试,并且变量绝对只能从AdminCityView当前访问。我不确定是否需要通过AdminCityView中的代码传递它,或者如果我应该返回到Screen 1并以某种方式将它传递给StateTable,然后再导航到AdminCityView。

我很高兴发布任何其他可能有助于达成答案的代码。谢谢!

+0

你为什么要使用两个表视图。我将使用一个表格视图与一个标题和两个部分为不同的选择。 – dasdom

+0

用于用户体验目的。在查看(屏幕)1上,用户将选择他们想要编辑的城市。屏幕2将允许他们编辑该城市的名称,它所属的州,并添加/编辑/查看该城市内的学校列表。有应用程序内是相似的,所以一旦我得到这个“模型”的工作,我要重复处理的其他数据集(同样,对于一个一致的UX)其他几个数据结构。 – user1933062

+0

为什么你不能为selectedState使用全局字符串变量。那么不需要传递价值。您可以直接从UITableViewController访问该变量。 –

回答

1

有3种方法可以完成这个任务,选择你的。

如果您使用故事板,您可以使用segue并完成它。 从你的代码我只能猜测你不是,因为 viewController:initWithNibName然后会是不合要求的。

那么,你是那种坚持的老路子,这证明是在某些时候最好的...

您可以使用通过NSNotificationCenter的通知。 您订阅您的stateTable使用

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethodToCall:) name:@"someName" object:nil]; 

的通知中心,其中观察者应该自我,选择是当通知发送(你可以选择帽子的名字,你愿意的话),你必须实现的方法将被调用,名称是通知(选择你喜欢)的名称和对象是你希望收到(你可能不需要指定这一个,除非你发送大量的通知)的通知的对象。

你也需要实现 - (空)someMethodToCall:是这样的:

-(void)someMethodToCall:(NSNotification *)notification{ 
    NSDictionary *dic = notification.userInfo; 
    //you will store all the data you want transferred in this, as you will see. 
    //use it as you like 
} 

你AdminCityView现在可以发送邮件到您的stateTable,以及那些可以携带的有效载荷。所有你需要做的是:

[self postNotificationName:@"theNameYouChoseAbove" object:yourFirstViewController userInfo:someDictionaryThatHoldsYourValues]; 

现在来自AdminCityView的数据在NSDictionary中传输。这些事情对于他们接受的东西真的很开放,所以你应该没问题。

的另一种方式是使用一个协议。

可以实现AdminCityView协议,像这样:

@protocol yourNameHereProtocol 
-(void)methodToCall:(NSString*)theData; 
@end 

只是做它在头文件中的接口,使用数据适合你的任何类型的上方。 NSString只是一个例子。

现在stateController需要遵守该协议。在stateController.h添加此背后的接口:

@interface stateController (UIViewController)<yourNameHereProtocol>{ 
} 
-(void)someMethodToCall:(NSString *)theData; 

现在stateController需要实现someMethodToCall,在那里你处理海图,你一半。

现在,为此创建dvController后:

[dvController setDelegate:stateController]; 

现在,dvController可以调用委托方法someMthodToCall:数据在stateController,经由数据属性发送该数据。

哦,你真的不需要两个TableViewControllers,你可以将周围的视图符合UITableViewDataSource和TableViewDelegate协议,并处理委托方法中的所有不同情况。但是,对于另一篇文章,我想。

如果您有任何疑问,请对此进行评论,我会回答一样好,我可以。 另外,我可能混合了分母为不同类和这样的,随意改变他们的IST似乎是合理的。

玩得开心