2015-08-09 6 views
1

У меня есть TabBarController с 4 вкладками, 3 из которых представляют собой таблицы. Я пытаюсь поместить деталь для каждой ячейки таблицы просмотра, и я не думаю, что раскадровка эффективна, так как у меня более 50 подробных страниц. Я очень новичок во всем этом, и я попытался выяснить, как связать деталь с каждой вкладкой в ​​течение нескольких часов. Мои представления таблиц начинаются со второго контроллера просмотра. Вот SecondViewController.m:XCode TableViewController для подробностей в Objective-C

#import "SecondViewController.h" 
@implementation SecondViewController 
{ 
    NSArray *tableData; 
} 
@synthesize tableData; 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    tableData = [NSArray arrayWithObjects:@"Carter", @"Greene", @"Hancock", @"Hawkins", @"Johnson", @"Sullivan", @"Unicoi", @"Washington", nil]; 
    [super viewDidLoad]; 

} 

#pragma mark - TableView Data Source methods 

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

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; 

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

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    cell.textLabel.text = [tableData objectAtIndex:indexPath.row]; 


    return cell; 
} 

@end 

Вот SecondViewController.h:

#import <UIKit/UIKit.h> 

@interface SecondViewController : UIViewController <UITableViewDelegate, 
UITableViewDataSource> 

@property(nonatomic, retain) NSArray *tableData; 
@end 

Если это помогает, вот моя раскадровки.

imgur.com/f9xdo0E

Если кто-нибудь может помочь мне по отдельности добавлять детали к каждой ячейке табличного наиболее безболезненным способом возможно, я был бы признателен. Благодаря!

+0

Вам, вероятно, нужно будет объяснить больше о том, что вы подразумеваете под деталями? Откройте контроллер подробного представления, когда пользователь нажимает на вашу ячейку? Пожалуйста, дополните. –

+0

Я использую Swift, поэтому, к сожалению, я не смогу подробно остановиться на вас в Obj-C, но я могу предложить решение высокого уровня. Вы должны создать другой 'UIViewController' ..... сказать' DetailViewController'. Вы можете настроить его, как вы хотите визуально, а затем, когда пользователь нажимает на «TableViewCell», выполните segue в «DetailViewController» и передайте данные из ячейки в контроллер представления. –

+1

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

ответ

0

При использовании раскадровки процесс довольно прост.

Во-первых, я бы предложил перетащить прототип «table view cell» на ваши виды таблиц. Вы можете затем управления от этого Drag-прототип клетки к сцене назначения добавить SEGUE между клеткой и следующей сценой:

enter image description here

Убедитесь в том, чтобы выбрать этот прототип ячейку и установите его раскадровку идентификатор (Я использовал «Cell»). Вам нужно будет ссылаться на этот идентификатор раскадровки, как показано в моем примере кода ниже. Я также настраивал связанные с внешним видом вещи (например, индикатор раскрытия) прямо в прототипе соты в IB, поэтому мне не нужно беспокоиться об этом в коде, и я могу видеть, как будет выглядеть пользовательский интерфейс в IB.

Теперь вы можете перейти к контроллеру табличного представления и (a) упростить cellForRowAtIndexPath (потому что вам не нужна эта логика о if (cell == nil) ... при использовании прототипов соты); но и реализовать prepareForSegue для передачи данных к месту назначения:

// SecondViewController.m 

#import "SecondViewController.h" 
#import "DetailsViewController.h" 

@interface SecondViewController() 
@property (nonatomic, strong) NSArray *tableData; 
@end 

@implementation SecondViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tableData = @[@"Carter", @"Greene", @"Hancock", @"Hawkins", @"Johnson", @"Sullivan", @"Unicoi", @"Washington"]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.destinationViewController isKindOfClass:[DetailsViewController class]]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     NSString *name = self.tableData[indexPath.row]; 
     [(DetailsViewController *)segue.destinationViewController setName:name]; 
    } 
} 

- (IBAction)unwindToTableView:(UIStoryboardSegue *)segue { 
    // this is intentionally blank; but needed if we want to unwind back here 
} 

#pragma mark - Table view data source 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.tableData.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    cell.textLabel.text = self.tableData[indexPath.row]; 

    return cell; 
} 

@end 

Очевидно, это предполагает, что вы создали DetailsViewController и конкретизирован его в качестве базового класса целевой сцены, а затем создать свойства для любых значений, которые вы хотите перейти к этой целевой сцене:

// DetailsViewController.h 

#import <UIKit/UIKit.h> 

@interface DetailsViewController : UIViewController 

@property (nonatomic, copy) NSString *name; 

@end 

и это направление сцена затем принять name значение, переданное ему и заполнить UILabel:

// DetailsViewController.m 

#import "DetailsViewController.h" 

@interface DetailsViewController() 

@property (weak, nonatomic) IBOutlet UILabel *nameLabel; 

@end 

@implementation DetailsViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.nameLabel.text = self.name; 
} 

@end 

Откровенно говоря, этот процесс, несомненно, будет более четко описан в любом учебнике UITableView, который включает обсуждение «прототипов ячеек» (в вашем примере кода вы использовали более старый учебник, предшествующий прототипам соты).

+1

Да, спасибо вам! Я начинаю понимать отношения между кодом и раскадрой, и это очень помогло! –

0

Я думаю, что отношения между кодом и раскадровки выглядит следующим образом:

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