2015-05-30 40 views
1

我有UIViewControllerTableViewTableView爲每個單元填充圖像和文本。現在,當用戶點擊一個單元格時,我需要提供其他Scenes。例如:iOS - 如何展示來自UITableViewCell的不同場景


- 輕按第一行 - >目前ViewController1
- 在第二排水龍頭 - >目前ViewController2


ViewController1ViewController2都在我的Storyboard場景。

我已經嘗試了各種解決方案,但沒有一個能起作用。此外,當我點擊某個單元格時(例如,我嘗試顯示警報),似乎並未調用didSelectRowAtIndexPath:方法。

這裏我的ViewController的代碼: ViewController.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 
{ 
    NSArray *recipes; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    recipes = [NSArray arrayWithObjects:@"News", @"Calendar",@"Take a photo",@"Draw",@"Mail us",@"Follow us on Facebook", nil]; 
} 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [recipes count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *simpleTableIdentifier = @"SimpleTableCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 

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

    if ([cell.textLabel.text isEqualToString:recipes[0]]) { 
     cell.imageView.image = [UIImage imageNamed:@"newsicon"]; 
    } 
    else if ([cell.textLabel.text isEqualToString:recipes[1]]) { 
     cell.imageView.image = [UIImage imageNamed:@"mensaicon"]; 
    } 
    else if ([cell.textLabel.text isEqualToString:recipes[2]]) { 
     cell.imageView.image = [UIImage imageNamed:@"fotoicon"]; 
    } 
    else if ([cell.textLabel.text isEqualToString:recipes[3]]) { 
     cell.imageView.image = [UIImage imageNamed:@"drawicon"]; 
    } 
    else if ([cell.textLabel.text isEqualToString:recipes[4]]) { 
     cell.imageView.image = [UIImage imageNamed:@"mailicon"]; 
    } 
    else if ([cell.textLabel.text isEqualToString:recipes[5]]) { 
     cell.imageView.image = [UIImage imageNamed:@"fbicon"]; 
    } 

    return cell; 
} 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // here we get the cell from the selected row. 
    UITableViewCell *selectedCell=[tableView cellForRowAtIndexPath:indexPath]; 

    if ([selectedCell.textLabel.text isEqualToString:recipes[0]]) { 
     UIAlertView *messageAlert = [[UIAlertView alloc] 
            initWithTitle:@"Row Selected" message:@"You've selected a row" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

     // Display Alert Message 
     [messageAlert show]; 

     NSString *storyboardName = @"Main"; 
     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil]; 
     UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"news"]; 
     [self presentViewController:vc animated:YES completion:nil]; 
    } 

    // use the image in the next window using view controller instance of that view. 
} 


@end 

我是新來的iOS開發,所以我不知道如果我的代碼是正確的,或者有其他更優雅的解決方案。無論如何,讓我們專注於這個問題,任何人都可以幫助我嗎?

+0

您的'didSelectedRowAtIndexPath'不會調用,因爲您已經通過單元添加的圖像。請設置imageView cell.imageView.userInteractionEnabled = false的屬性。在此之後,你調用了'didSelectedRowAtIndexPath'。還可以像'self一樣設置委託和數據源。tabelView.delegate = self; self.tableView.datasource = self;'。 –

回答

1

如果你的觀點只是一個表視圖,我會建議使用UITableViewController而不是UIViewController。如果你在現有的UIViewController中有一個UITableView,你需要自己設置委託和數據源方法。
您可以在故事板中執行此操作。點擊你的tableView,然後選擇連接檢查器。然後單擊dataSource旁邊的圓圈並將其拖到您的視圖控制器。對代表做同樣的事情。這可能是你的表視圖方法沒有被調用的原因。

如果它是一個靜態表格,您可以從故事板中的每個單元格創建獨立的細分。

+0

... facepalm之前。我知道,但我忘了拖拽委託給視圖控制器。多麼愚蠢的錯誤。謝謝你提醒我。大概這裏的每個人都試圖說出來,但你的回答是讓我明白髮生了什麼的那個。 – Kurtis92

0

根據你的代碼警報當你點擊第一小區將只顯示僅.. 而是根據你的需要讓我寫一個代碼,這將幫助你..

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // here we get the cell from the selected row. 
    NSString *selectedcelltext=[recipes objectAtIndex:indexPath.row]; 

    UIAlertView *messageAlert = [[UIAlertView alloc] 
           initWithTitle:@"Row Selected" message:[NSString stringWithFormat:@"You've selected a %@ row ",selectedcelltext] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

    // Display Alert Message 
    [messageAlert show]; 


    if ([selectedcelltext isEqualToString:recipes[0]]) { 

     NSString *storyboardName = @"Main"; 
     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil]; 
     UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"news"]; 
     [self presentViewController:vc animated:YES completion:nil]; 
    } 
    else if ([selectedcelltext isEqualToString:recipes[1]]) { 

     NSString *storyboardName = @"Main"; 
     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil]; 
     UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"calendar"]; 
     [self presentViewController:vc animated:YES completion:nil]; 
    } 


    // use the image in the next window using view controller instance of that view. 
} 
1

而且看起來方法didSelectRowAtIndexPath:當我點擊一個單元格時沒有被調用(例如,我試圖顯示一個警報)。

你的基礎類是UIViewController,因此,您UITableViewDelegateUITableViewDataSource將不會自動設置。你需要自己做。例如,你可以將它們設置在init功能:

- (instancetype)init { 
    self = [super init]; 
    if(self) { 
     self.delegate = self; 
     self.datasource = self; 
    } 
    return self; 
} 

另一種方法是使用UITableViewController作爲基地電話,那麼你就不需要擔心設置的代表。

+0

我應該在哪裏放這個代碼?在ViewController.h中? – Kurtis92

+0

@ Kurtis92,在.m文件中,你可以將它們放在viewDidLoad函數 –

相關問題