UITableViewController с несколькими переходами к неправильному представлению

Так что тут я совсем запутался. Я использую xcode 5, и у меня есть представление таблицы с двумя переходами. Первоначально я пытался установить переходы с двумя разными ячейками-прототипами, но это не сработало. Итак, теперь у меня установлены оба перехода в UITableViewController. Кажется, что тот переход, который я создал последним, и будет тем, к которому он переходит. Я не получаю никаких ошибок, и когда я выполняю код, он срабатывает в правильной строке для выполнения перехода.

Это, кажется, выполняется отлично каждый раз, но просто не переходит к правильному представлению.

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if([currentTableViewType isEqualToString:@"feedbackOnly"]){
        // hits this line correctly
        [self performSegueWithIdentifier:@"ShowSendFeedback" sender:indexPath];
    } else {
        // hits this line correctly
        [self performSegueWithIdentifier:@"ShowTicketDetails" sender:indexPath];
    }
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(NSIndexPath *)selectedIndexPath {
    if ([[segue identifier] isEqualToString:@"ShowTicketDetails"])
    {
        TicketDetailsViewController *tdv = [segue destinationViewController];
        NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];
        long row = [myIndexPath row];
        Ticket * currentTicket = [ticketsArray objectAtIndex:row];
        tdv.tPriority = currentTicket.ticketPriority;
        tdv.tId = currentTicket.ticketId;
        tdv.tStatus = currentTicket.ticketStatus;
    }

    if ([[segue identifier] isEqualToString:@"ShowSendFeedback"]){
        FeedbackViewController *fvc = [segue destinationViewController];
        NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];
        long row = [myIndexPath row];
        Ticket * currentTicket = [ticketsArray objectAtIndex:row];
        fvc.tPriority = currentTicket.ticketPriority;
        fvc.tId = currentTicket.ticketId;
        fvc.tStatus = currentTicket.ticketStatus;
    }
}

Чтобы быть тщательным, я включил весь свой контроллер, у которого есть проблема.

#import "TicketsViewController.h"
@interface TicketsViewController ()
@end
@implementation TicketsViewController
@synthesize json, ticketsArray, ticketsTableView, currentTableViewType;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Tickets";

    AppDataClass *appData=[AppDataClass getInstance];
    currentTableViewType = appData.tableViewType;
    [self retrieveData];
}

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

#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return ticketsArray.count;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if([currentTableViewType isEqualToString:@"feedbackOnly"]){
        return @"Requires Feedback";
    } else {
        return @"Issues";
    }
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

    Ticket * currentTicket = [ticketsArray objectAtIndex:indexPath.row];

    cell.textLabel.text = currentTicket.ticketName;
    cell.detailTextLabel.text = currentTicket.ticketAddress;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    if([currentTicket.ticketPriority.lowercaseString isEqualToString:@"high"]) {
        cell.imageView.image = [UIImage imageNamed:@"alert.png"];
        if([indexPath row] % 2) [cell setBackgroundColor:[UIColor lightGrayColor]];
    }
    return cell;
}

#pragma mark - Methods
- (void)retrieveData
{
   // NSURL * url = [NSURL URLWithString:getDataURL];
   // NSData * data = [NSData dataWithContentsOfURL:url];
    AppDataClass *appData=[AppDataClass getInstance];
    NSString *args = @"userid=%@&authid=%@";
    NSString *values=[NSString stringWithFormat:args, appData.userId, appData.authId];
    json = [appData getPostData:appData.URL_LIST_TICKETS:values];

    ticketsArray = [[NSMutableArray alloc] init];

    // segeue names
    // allTickets
    // feedbackOnly

    for(int i=0; i<json.count; i++){
        NSString * tId = [[json objectAtIndex:i] objectForKey:@"id"];
        NSString * tName = [[json objectAtIndex:i] objectForKey:@"name"];
        NSString * tPriority = [[json objectAtIndex:i] objectForKey:@"priority"];
        Ticket * myTicket = [[Ticket alloc] initWithTicketId:tId andTicketName:tName andTicketPriority:tPriority];
        [ticketsArray addObject:myTicket];
    }

    [self.ticketsTableView reloadData];

}

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if([currentTableViewType isEqualToString:@"feedbackOnly"]){
        [self performSegueWithIdentifier:@"ShowSendFeedback" sender:indexPath];
    } else {
        [self performSegueWithIdentifier:@"ShowTicketDetails" sender:indexPath];
    }
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(NSIndexPath *)selectedIndexPath {
    if ([[segue identifier] isEqualToString:@"ShowTicketDetails"])
    {
        TicketDetailsViewController *tdv = [segue destinationViewController];
        NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];
        long row = [myIndexPath row];
        Ticket * currentTicket = [ticketsArray objectAtIndex:row];
        tdv.tPriority = currentTicket.ticketPriority;
        tdv.tId = currentTicket.ticketId;
        tdv.tStatus = currentTicket.ticketStatus;
    }

    if ([[segue identifier] isEqualToString:@"ShowSendFeedback"]){
        FeedbackViewController *fvc = [segue destinationViewController];
        NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];
        long row = [myIndexPath row];
        Ticket * currentTicket = [ticketsArray objectAtIndex:row];
        fvc.tPriority = currentTicket.ticketPriority;
        fvc.tId = currentTicket.ticketId;
        fvc.tStatus = currentTicket.ticketStatus;
    }
}

@end

person user3213780    schedule 20.01.2014    source источник


Ответы (1)


Хорошо... похоже, это ошибка в XCode. Первоначально я скопировал второй ViewController, к которому пытался перейти, и изменил его класс, а также некоторые компоненты представления. Я полагал, что StoryBoard будет достаточно умен, чтобы переназначить это представление как свое собственное. Я был неправ. XCode, похоже, это не понравилось. Начиная с нуля с новым ViewController, похоже, все исправлено, и переходы теперь работают правильно. Точно такой же код работает.

Поэтому, если у кого-то возникла эта проблема, убедитесь, что вы не скопировали и не вставили ViewController, к которому вы пытаетесь перейти. Это сэкономит вам часы головной боли :-)

Вероятно, у него была ссылка на тот же ViewController, поэтому последний установленный мной переход был единственным работающим.

person user3213780    schedule 21.01.2014
comment
Когда вы скопировали контроллер представления, он скопировал бы пользовательский класс контроллера представления, если бы вы его установили. Если это так, это то, что вам нужно было бы обновить на новом контроллере представления. См. шаг 2 по следующей ссылке разработчика. apple.com/library/ios/recipes/ - person Jesse; 21.01.2014