2014-03-31 89 views
0

即時通訊iOS編程中的新功能。我有1個問題,我已經在谷歌和這個頁面搜索,但我找不到答案。如何將數據IBOutlet連接到UITableView

  • 我想建立一個簡單的聯繫方式演示版。它有2個視圖

  • 第一視圖,我有一個UITableView與空數據,和1添加按鈕。當我點擊添加按鈕,它會出現第二個視圖

  • 第二個視圖,它有窗體和1保存按鈕。填寫完表單後,我單擊保存按鈕,然後我想將它更新到UITableView的單元格,但它不起作用。

對不起我的英文不好,希望你能理解

這裏是我的代碼: 先向Contact.h存儲數據

#import <Foundation/Foundation.h> 

@interface Contact : NSObject{ 

} 

@property(strong, nonatomic) NSString *name; 
@property(strong, nonatomic) NSString *phoneNumber; 
@property(strong, nonatomic) NSString *company; 
@property(strong, nonatomic) NSString *email; 
@property(strong, nonatomic) NSString *address; 

@end 

處理事件時,單擊保存按鈕(第二視圖):

- (IBAction)saveButton:(id)sender 
{ 

    Contact *c = [[Contact alloc] init]; 
    c.name = self.nameText.text; 
    c.company = self.comText.text; 
    c.phoneNumber = self.phoneText.text; 
    c.email = self.emailText.text; 
    c.address = self.addressText.text; 

    /*telephoneViewController is a class that store my TableView (it is the first view) 
    */ 
    TelephoneViewController *tv = [[TelephoneViewController alloc] init]; 
    tv.dataObj = [[NSMutableArray alloc]init]; 

    [tv.tableView beginUpdates]; 
    [tv.dataObj addObject:c]; 

    [tv.tableView insertRowsAtIndexPaths:tv.dataObj withRowAnimation: 
    UITableViewRowAnimationRight]; 

    [tv.tableView endUpdates]; 
    [tv.tableView reloadData]; 

    // back to first view (UITableView view) 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

這是我第一次查看: // dataObj是的NSMutableArray,我將其創建存儲聯繫人數據然後我用它在的UITableView

- (void) viewWillAppear:(BOOL)animated 
{ 

    [self.tableView reloadData]; 
} 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    self.dataObj = [[NSMutableArray alloc]init]; 

} 
- (void)didReceiveMemoryWarning 
    { 
     [super didReceiveMemoryWarning]; 
     // Dispose of any resources that can be recreated. 
    } 

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 

     return [self.dataObj count]; 

    } 

    - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
     if(cell==nil){ 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
       } 

     cell.textLabel.text = [self.dataObj objectAtIndex:indexPath.row]; 

     return cell; 
    } 

    //handle when click add button 
    - (IBAction)addButton:(id)sender 
    { 
     //go to second view (view to fill out form) 
     ContactViewController *vc = [[ContactViewController alloc] init]; 
     [self.navigationController pushViewController:vc animated:YES]; 
    } 

UPDATE顯示 // ================= ===================

在我的FirstView中,我添加了2個方法。但它得到的異常(或錯誤):

- [聯繫行]:無法識別的選擇發送到實例0x8c46610 2014年4月1日22:10:43.750 TelephoneDemo [463:70B] *終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,原因是:「 - [聯繫列]:無法識別的選擇發送到實例0x8c46610」

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     // Do any additional setup after loading the view from its nib. 
     self.dataObj = [[NSMutableArray alloc]init]; 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addContact:) name:@"didAddContact" object:nil]; 
    } 


- (void) addContact:(NSNotification *)notification 
{ 
    Contact *c = (Contact *) notification.object; 

    self.dataObj = [[NSMutableArray alloc]init]; 
      [self.tableView beginUpdates]; 
    [self.dataObj addObject:c]; 
    [self.tableView insertRowsAtIndexPaths:self.dataObj withRowAnimation:UITableViewRowAnimationRight]; 

      [self.tableView endUpdates]; 
      [self.tableView reloadData]; 
} 
+0

哪裏是IBOutlet屬性 – Spynet

+0

@Spynet在其他.h文件 –

回答

0

在這裏,你會錯了。

/*telephoneViewController is a class that store my TableView (it is the first view) 
    */ 
    TelephoneViewController *tv = [[TelephoneViewController alloc] init]; 
    tv.dataObj = [[NSMutableArray alloc]init]; 

您不應該創建TelephoneViewController的新實例。因爲它與你來自的視圖控制器不同。爲了簡單起見,我會解釋你,假設你有兩個視圖控制器VC A和VC B。表格VC A您正在通過推動移動到VC B。在B內,您將創建一個VC A(稱爲A1)並設置其陣列的新實例。並回到VC A。在這裏看到AA1兩個不同的同一類的實例。因此,如果您將其設置爲VC A1,VC A將如何獲取數據。我希望你現在明白了。這是初學者最常見的做法。

所以這裏的解決方案是你應該遵循委託模式來在視圖控制器之間傳遞數據。

+0

謝謝你的代表,它的確是我的問題。我想我必須首先初始化它(alloc - init)。我必須仔細閱讀委託文件。 –

+0

你不應該再次初始化它。您應該在VC B中擁有相同的VC A實例。無論如何,請檢查代理如何工作。你必須知道這個概念。並讓我知道,如果你有任何具體的疑問 –

-1

你的代碼看起來是正確的,只要確保你的tableview委託方法在重載數據後被調用。

+0

代碼看起來正確嗎?你確定? –

+0

OP的代碼很不正確。阿尼爾的回答給出了有關錯誤的確切解釋。 – dezinezync

0

檢查Anil的答案是什麼目前你的代碼有問題。

下面介紹如何讓事情發展。

  1. 在你的第一個視圖控制器的initviewDidLoad方法,使用NSNotificationCenter聽一個特定的事件,如:didAddNewContact。該代碼看起來是這樣的:

    [NSNotificationCenter defaultCenter] addObserver:self selector:@selector:(addContact:) name:@"didAddNewContact" object:nil]; 
    
  2. 在同一個視圖控制器的dealloc的或類似的方法,你也應該遵守該通知刪除自身。

  3. 在你的第二個視圖控制器,當用戶點擊保存按鈕,你根本就不是創建表的新實例是這樣的:

    Contact *c = [[Contact alloc] init]; 
    c.name = self.nameText.text; 
    c.company = self.comText.text; 
    c.phoneNumber = self.phoneText.text; 
    c.email = self.emailText.text; 
    c.address = self.addressText.text; 
    
    [NSNotificationCenter defaultCenter] postNotificationName:@"didAddNewContact" object:c]; 
    
    // back to first view (UITableView view) 
    [self.navigationController popViewControllerAnimated:YES]; 
    

    這裏發生的是,通知中心發送我們的第一個視圖控制器將捕獲的通知。

  4. 還記得我們開始收聽通知嗎?我們使用了選擇器addContact:。有時間來實現這一點。

    - (void)addContact:(NSNotification *)notification 
    { 
        // This is the same one the user created. Use this as required by the logic 
        Contact *c = (Contact *)notification.object; 
    
        // Now you can either reload the data by calling reloadData on the UITableView or use the insertRowsAtIndexPaths:withRowAnimation method. 
    
        //This assumes you have properly implemented the UITableView Datasource protocol methods in your view controller or elsewhere 
        NSInteger section = [self numberOfSectionsInTableView:tableView]-1; 
    
        NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:[self tableView:tableView numberOfRowsInSection:section] inSection:section]; 
    
        [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    } 
    
+0

感謝您的代表。但我應該把它連接到什麼?我運行我的應用程序並收到一條消息:無法識別的選擇器 –

+0

你在哪條線上出現錯誤? 另外,你有沒有實現addContact?這是你知道的唯一無法識別的選擇器。 – dezinezync

+0

是的,我已經實現了它。但我仍然收到消息:聯繫行]:無法識別的選擇發送到實例, 終止應用程序由於未捕獲的異常'NSInvalidArgumentException',原因:' - [聯繫行]:無法識別的選擇發送到實例 –

0

使用代理就可以得到解決。經過下面的代碼,

在第二個控制器的.h文件中

@protocol PopOverViewControllerDelegate; 

@interface PopOverViewController : UITableViewController 
{ 
    //Declare your variable 
} 

@property (nonatomic, weak) id<PopOverViewControllerDelegate> delegate; 
@end 

@protocol PopOverViewControllerDelegate <NSObject> 

- (void)PopOverViewController:(PopOverViewController *)viewController 
      didChooseValue:(NSString *)value; 

@end 

在secondcontroller的.m文件

id<PopOverViewControllerDelegate> strongDelegate = self.delegate; 
[strongDelegate PopOverViewController:self didChooseValue:selection]; // selection means, your value to send back. 

申報popoverControllerDeleage在firstcontroller的.h文件中,然後在firstcontroller的.m文件

-(void)PopOverViewController:(PopOverViewController *)viewController didChooseValue:(NSString *)value 
{ 
    NSLog("%@",value); 
}