Вызов нового представления при выборе строки в «UITableView» - PullRequest
7 голосов
/ 20 апреля 2011

Я сейчас пишу свое первое приложение для iPhone, но столкнулся с проблемой.У меня есть представление, которое содержит UITableView.Это первый раз, когда я пытался это сделать, и я пытаюсь добиться такого поведения:

Когда пользователь выбирает одну из строк, я бы хотел, чтобы это вызывало новое представление, принимаяПользователь на другой странице, отображающий информацию в соответствии с тем, что они выбрали.

У меня есть в настоящее время, поэтому, когда пользователь выбирает строку, он отображает UIAlert в том же виде, но это не соответствует моим потребностям,Я настроил UITableView через конструктор интерфейса и ввел следующий код в мой файл .m для его настройки.

- (NSInteger)tableView:(UITableView *)tableView 
 numberOfRowsInSection:(NSInteger)section {
    //return the value
    return 10;
}

//now we define the cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // Identifier for retrieving reusable cells.
    static NSString *cellIdentifier = @"MyCellIdentifier";

    // Attempt to request the reusable cell.
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    // No cell available - create one
    if(cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                      reuseIdentifier:cellIdentifier];
    }

    // Set the text of the cell to the row index.
    cell.textLabel.text = [NSString stringWithFormat:@"iPad %d", indexPath.row];

    return cell;
}

Это создает список из десяти строк.Следующие коды дают мне UIAlert при нажатии, однако я хочу удалить это и заставить его вызывать новое представление по моему выбору:

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

    // Show an alert with the index selected.
    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"iPad Selected"                         
                          message:[NSString stringWithFormat:@"iPad %d", indexPath.row]                     
                          delegate:self       
                          cancelButtonTitle:@"OK"           
                          otherButtonTitles:nil];
    [alert show];
    [alert release];   

}

Может кто-нибудь помочь с этим последним фрагментом кода?представление, которое я хочу вызвать, называется ProteinView.

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011

Хорошо, нам нужно использовать один из методов UITableView, которые уже доступны для нас. Мы сделаем следующее.

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

ProteinView *detailViewController = [[ProteinView alloc] initWithNibName:@"ProteinView" bundle:nil];

        // It is here we'd pass information from the currently selected UITableViewCell to the ProteinView.
        // An example of this is the following.

        // I would do it like this, but others would differ slightly.
        NSString *titleString = [[[NSString alloc] initWithFormat:@"iPad %d",indexPath.row] autorelease];

        // title is an object of detailViewController (ProteinView). In my own instances, I have always made a NSString which in viewDiDLoad is made the self.navigationBar.title string. Look below for what my ProteinView.m and .h would look like.
        detailViewController.stringTitle = titleString;
        // ...
        // Pass the selected object to the new view controller.
        [self.navigationController pushViewController:detailViewController animated:YES];
        [detailViewController release];
}

EDIT

// -------- ProteinView.m -------- //

- (void)viewDidLoad {

[super viewDidLoad];
// Do any additional setup after loading the view from its nib.

// Here we set the navigationItem.title to the stringTitle. stringTitle is declared in the .h. Think of it as a global scope variable. It is also propertised in the .h and then synthesized in the .m of ProteinView. 
self.navigationItem.title = stringTitle;
}

Я не скомпилировал это, поэтому я не знаю, сработает ли это полностью. Но это, безусловно, самый быстрый и простой способ сделать это!

1 голос
/ 20 апреля 2011

Вы можете представить вид модально, как это

YourViewController2 *viewController2 = [[YourViewController2 alloc]initWithNibName:@"YourViewController2" bundle:nil];
[self presentModalViewController:viewController2 animated:YES];

У вас есть более одного представления? В этом случае вам нужно будет создать массив с именами, передать его в табличное представление и затем представить правильное представление для выбранной строки на основе indexPath.row.

0 голосов
/ 20 апреля 2011

вам придется открыть свой MainWindow.xib и добавить к нему контроллер навигации. Затем добавьте розетку контроллера навигации в ваш делегат приложения и подключите их. Затем вам нужно установить представление контроллера навигации как представление вашего основного окна.

Вы можете легко добавить табличное представление в любое приложение iPhone, просто создав новый подкласс UITableViewController из команды File -> New.

Даже если вы пойдете по этому пути, я бы предложил создать новый навигационный проект для использования в качестве шаблона / шпаргалки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...