2014-01-04 5 views
0

Я новичок в программировании на iOS. Я следую за книгой и некоторыми учебниками, чтобы узнать ее. Мне нужна помощь в понимании этих методовiOS - segue и tableView

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"PushAppDetails"]) 
    { 
     AppDetailsViewController *appDetailsViewController = segue.destinationViewController; 
     UITableViewCell *cell = sender; 
     appDetailsViewController.appDetails = 
     [[AppDetails alloc] initWithName:cell.textLabel.text 
          description:cell.detailTextLabel.text]; 
    } 
} 



{ 
    //Set the CellIdentifier that you set in the storyboard 
    static NSString *CellIdentifier = @"AppCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    switch (indexPath.row) 
    { 
     case 0: 
      cell.textLabel.text = @"Awesome App"; 
      cell.detailTextLabel.text = @"Long description of the awesome app..."; 
      break; 
     case 1: 
      cell.textLabel.text = @"Even More Awesome App"; 
      cell.detailTextLabel.text = @"Long description of the even more awesome app..."; 
      break; 
     case 2: 
      cell.textLabel.text = @"The Most Awesome App Ever"; 
      cell.detailTextLabel.text = 
      @"Long description of the most awesome app ever seen..."; 
      break; 

     default: 
      cell.textLabel.text = @"Unkown"; 
      cell.detailTextLabel.text = @"Unknown"; 
      break; 
    } 

    return cell; 
} 

То, что я не понимая, вот эти линии

UITableViewCell *cell = sender; 
      appDetailsViewController.appDetails = 
      [[AppDetails alloc] initWithName:cell.textLabel.text 
           description:cell.detailTextLabel.text]; 

Я получил это, что я идентифицирующий SEGUE от этой линии [segue.identifier isEqualToString:@"PushAppDetails"], а затем я создал объект из AppdetailsViewController класса, но я не понял, что делает эта линия

UITableViewCell *cell = sender; 

и как эта линия звонит нижнюю табличную функцию, когда функция переключателя является и описанием каждой ячейки и ни этой линией

appDetailsViewController.appDetails = 
     [[AppDetails alloc] initWithName:cell.textLabel.text 
          description:cell.detailTextLabel.text]; 

У меня есть метод в моем appDetails классе .. почему бы не просто я могу это сделать, если я должен доступа, метод

AppDetails *app = new [AppDetails alloc]init 
    [app initWithName:cell.textLabel.text 
          description:cell.detailTextLabel.text]; 

Я на самом деле пришли из Java, так что я чувствую себя немного трудно понять это

ответ

1

UITableViewCell *cell = sender; в основном бросает sender к экземпляру UITableViewCell через переменную. Это используется для доступа к cell.textLabel и cell.detailTextLabel. Поскольку sender имеет тип id, вы не можете написать sender.textLabel. Но вы можете бросить на место, если хотите:

appDetailsViewController.appDetails = 
    [[AppDetails alloc] initWithName:((UITableViewCell *)sender).textLabel.text 
         description:((UITableViewCell *)sender).detailTextLabel.text]; 

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

, и эта линия не вызывает tableView:cellForRowAtIndexPath:, она берет NSStrings, которые уже установлены в UITableViewCell. Код яблок, который вызывает prepareForSegue:sender:, передаст затронутую ячейку в качестве параметра sender.


AppDetails *app = new [AppDetails alloc]init 
[app initWithName:cell.textLabel.text description:cell.detailTextLabel.text]; 

Прежде всего, это не действует Objective-C. Если вы пишете код в Objective-C, вы не должны ожидать, что сможете использовать синтаксис Java.

И в Objective-c вы не должны вызывать init более одного раза, в зависимости от реализации init это может иметь много странных эффектов.

Например, возьмем этот код:

- (id)init { 
    if (self = [super init]) { 
     self.label = [[UILabel alloc] init]; 
     [self.view addSubview:self.label]; 
    } 
    return self; 
} 

- (id)initWithName:(NSString *)name { 
    if (self = [self init]) { // calls init 
     self.label.text = name; 
    } 
    return self; 
} 

Если вы звоните init это добавит новый UILabel, и если вы звоните initWithName: позже, это добавит еще один UILabel, потому что initWithName: будет вызывать init себя.
Итак, если вы позвоните по телефону init, а затем initWithName:, вы получите два UILabels.
Поскольку вы не знаете детали реализации большинства методов init, которые вы вызываете, вы никогда не должны вызывать init более одного раза в Objective-C.

init... всегда должен быть частью [[Object alloc] init....

+0

thankyouu очень .. – hellosheikh

Смежные вопросы