iPhone: сгруппированные таблицы и проблемы с контроллером навигации - PullRequest
0 голосов
/ 06 мая 2010

Я установил сгруппированную таблицу в своем приложении, и переход к новым представлениям работает нормально. За исключением одного. Названия и макет стека все странные. Вот разбивка:

  1. У меня в таблице две секции.
  2. Когда я нажимаю на первую строку в первом разделе, я возвращаюсь к правильному представлению, но заголовок нового представления - это имя первой строки во втором разделе таблицы.
  3. В свою очередь, вторая строка в заголовке первого раздела - это вторая строка в заголовке второго раздела.

Если я коснусь второй строки во втором разделе таблицы корневого представления, кнопка навигации перейдет ко второй строке в разделе first таблицы.

Итак, вот схема моей таблицы:


Таблица Раздел 1
Ряд 1
Ряд 2
Ряд 3

Таблица Раздел 2
Ряд А
Ряд B
Строка C


Так что, если я коснусь строки 3, заголовок выдвинутого вида будет строкой C. Навигационная кнопка говорит мне вернуться к строке 3, а затем в конечном итоге окажется в корневом представлении.

Вот мой файл реализации, выдвигающий представления:

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

    //CSS
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"CSS"])
    {
        CSSViewController *css = [[CSSViewController alloc] initWithNibName:@"CSSViewController" bundle:nil];
        [css setTitle:@"CSS"];
        [self.navigationController pushViewController:css animated:YES];
    }

    //HTML
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"HTML"])
    {
        HTMLViewController *html = [[HTMLViewController alloc] initWithNibName:@"HTMLViewController" bundle:nil];
        [html setTitle:@"HTML"];
        [self.navigationController pushViewController:html animated:YES];
    }

    //JS
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"JavaScript"])
    {
        JSViewController *js = [[JSViewController alloc] initWithNibName:@"JSViewController" bundle:nil];
        [js setTitle:@"JavaScript"];
        [self.navigationController pushViewController:js animated:YES];
    }

    //PHP
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"PHP"])
    {
        PHPViewController *php = [[PHPViewController alloc] initWithNibName:@"PHPViewController" bundle:nil];
        [php setTitle:@"PHP"];
        [self.navigationController pushViewController:php animated:YES];
    }

    //SQL
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"SQL"])
    {
        SQLViewController *sql = [[SQLViewController alloc] initWithNibName:@"SQLViewController" bundle:nil];
        [sql setTitle:@"SQL"];
        [self.navigationController pushViewController:sql animated:YES];
    }

& массив данных таблицы:

- (void)viewDidLoad {
    [super viewDidLoad];


    arryClientSide = [[NSArray alloc] initWithObjects:@"CSS",@"HTML",@"JavaScript",nil];
    arryServerSide = [[NSArray alloc] initWithObjects:@"Objective-C", @"PHP",@"SQL",nil];
    // arryResources = [[NSArray alloc] initWithObjects:@"HTML Colour Codes", @"Useful Resources", @"About",nil];
    self.title = @"Select a Language";
    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

Любая помощь будет очень признательна.
Jack

Ответы [ 2 ]

4 голосов
/ 06 мая 2010

Я думаю, что вы пропустили оператор if, чтобы определить, на какой раздел нажал пользователь. Помните, что NSIndexPath имеет свойство строки и раздела. Я обычно делаю что-то вроде этого:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if ( indexPath.section == 0 ) {
  // Do something with arryClientSide
}
if ( indexPath.section == 1 ) {
  // Do something with arryServerSide
}

Я предполагаю, что вы используете сгруппированную таблицу.

Cheers, -дан

0 голосов
/ 06 мая 2010

Дэн прав, вам нужно использовать переменную indexPath.section.Похоже, ваш код выглядит так: вы фактически выдвигаете 2 контроллера представления, поскольку у вас есть ряд отдельных операторов if, после нажатия «Строка 1» происходит следующее:

isEqual: @ «CSS» будетверните true,

нажмите контроллер представления CSS,

, затем опустите и продолжайте проверять (если .. isEqual: @ "HTML") .. (если .. isEqual: @ "JavaScript")

тогда достаточно точно (если .. isEqual: @ "PHP") также вернет true и выдвинет контроллер представления php.

Я не знаю всего вашего приложения, но одно наблюдениеЯ замечаю здесь (помимо утечек памяти), что у вас есть один контроллер представления / nib, выделенный для каждого языка ... если контроллеры представления имеют совершенно различное поведение / внешний вид, то я думаю, что это то, что вы должны сделать, но я бы порекомендовал попробовать посмотретьсходство между каждым и посмотреть, если вы не можете сделать один "LanguageViewController", передать на каком языке он должен представлять и выполнить инициализацию / установить свойства контекста представленияОллер основывался на этом.Это может не применяться, но если это так, это сэкономит вам много работы!

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