2013-11-11 3 views
2
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSLog((@"This is didSelectRowAtIndexPAth")); 
    DetailViewController *detailViewController = [[DetailViewController alloc] init]; 
    detailViewController.myDictionary = [self.placeArray objectAtIndex:[indexPath row]]; 

    /* The below NSlog is showing the content , its not null still in next viewcontroller same variable showing null content*/ 

    NSLog(@"My Dictionary: This is a MasterView%@",detailViewController.myDictionary); 
    [self performSegueWithIdentifier:@"showDetail" sender:self]; 
} 

ответ

3
try this 

Decalre один NSInteger varable Globaly назначить этот varble для indexpath.row

@interface DashbordViewController() 
    { 

     NSInteger  SelectedRownum; 

    } 
    @end 

    @implementation DashbordViewController 
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
    { 
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
     if (self) { 
      // Custom initialization 
       } 
     return self; 
    } 

    - (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
    } 

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

       SelectedRownum=indexPath.row 
       [self performSegueWithIdentifier:@"showDetail" sender:self]; 
     } 

     - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
      { 

       if ([[segue identifier] isEqualToString:@"showDetail"]) 
       { 

        NSLog((@"This is didSelectRowAtIndexPAth%@",SelectedRownum)); 
        DetailViewController *detailViewController = [segue destinationViewController]; 
        detailViewController.myDictionary = [self.placeArray objectAtIndex:SelectedRownum]; 


      } 


     } 
+0

Где метод prepareForSegue получает переменную indexPath? – Abizern

+0

@Abizern i обновил мой код, а затем проверил его – Muralikrishna

3

Это потому, что представленный экземпляр вашего DetailViewController отличается от экземпляра, который вы создаете вручную. Вы должны либо представить этот новый ViewController самостоятельно (по моделям или путем нажатия), либо реализовать метод prepareForSegue и установить там словарь.

Редактировать:

В 2 решения:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    DetailViewController *detailViewController = [[DetailViewController alloc] init]; 
    detailViewController.myDictionary = [self.placeArray objectAtIndex:[indexPath row]]; 

    // If it is a modal 
    [self presentViewController:detailViewController animated:YES]; 
} 

ИЛИ

@implementation MyClass { 
    NSIndexPath *selectedCellIndexPath; 
} 

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

    NSLog((@"This is didSelectRowAtIndexPAth")); 
    selectedCellIndexPath = indexPath; 

    [self performSegueWithIdentifier:@"showDetail" sender:self]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"showDetail"]) { 
     DetailViewController *detailViewController = (DetailViewController *)segue.destinationViewController; 
     detailViewController.myDictionary = [self.placeArray objectAtIndex:selectedCellIndexPath.row]; 
    } 
} 
+0

Не могли бы вы рассказать о своем решении? – Vishal

+0

Что такое segue «showDetail» (push, modal, popover)? – Levi

+0

Я отредактировал свой ответ – Levi

1

В проверке DetailViewController если MyDictionary это свойство объявлен слабым или сильным ..

+0

Это было нетомично, сохраните, я изменил его на сильный. Все еще нет контроллера. – Vishal

0

Поскольку я не могу видеть реализацию контроллера (являющегося подклассом UIViewController или нет), я не могу сказать много, но имейте в виду, что initWithNibName:bundle: является назначенным инициализатором для UIViewController, а не init. Итак, это первая проблема. В любом случае проверьте экземпляр перед установкой свойства. Вполне вероятно, что экземпляр равен нулю.

EDIT:

Это также весьма вероятно, что они вы инстанцирование нового View Controller из существующих. В этом случае вы можете добавить новый контроллер представления в качестве дочернего контроллера или представить новый контроллер из существующего. В обоих случаях свойства существующих доступны из новых свойств: parentViewController и presentingViewController, что делает историю противоположной: вы берете значение свойства от существующего контроллера в новый контроллер.

+0

Что мне делать с initWithNibName? – Vishal

+0

Если у вас есть файл NIB, связанный с вашим DetailViewController, тогда инициализируйте это имя и комплект NIB с помощью nil. Пожалуйста, прочитайте информацию Apple Developer о классе UIViewController и https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457. – mbpro

+0

У меня нет файла NIB, я работаю над раскадрой. – Vishal

1

попробуйте это. , ,

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     NSLog((@"This is didSelectRowAtIndexPAth")); 

     UIStoryboard *mystoryboard = [UIStoryboard storyboardWithName:@"myStoryBoardName" bundle:nil]; 
     self.detailsViewController = [mystoryboard instantiateViewControllerWithIdentifier:@"detailviewcontroller"] 

    /* The below NSlog is showing the content , its not null still in next viewcontroller same variable showing null content*/ 

    NSLog(@"My Dictionary: This is a MasterView%@",detailViewController.myDictionary); 
    [self performSegueWithIdentifier:@"showDetail" sender:self]; 
} 

Вы должны установить идентификатор своего элемента detailViewController в storyBoard.

+1

NSLog для словаря по-прежнему показывает нулевое значение. – Vishal

1

Вам необходимо назначить словарь в методе prepareForSegue:.

 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 

    DetailViewController *viewController = = (DetailViewController *)[segue destinationViewController]; 
    detailViewController.myDictionary = //YOUR Dictionary here; 

} 

Таким образом, этот же словарь можно получить в viewDidLoad: из DetailViewController.

Примечание. Обязательно укажите словарь.

Надеюсь, что это поможет.

+0

OMG. Зачем?!!! Я не могу передать dict так: 'dvc.dataArguments = [словарь NSDictionaryWithObject: self.selectedDate forKey: kDateKey];' или вот так: 'NSDictionary * arguments = @ {self.selectedDate: kDateKey}; viewController.dataArguments = arguments; '. Вместо этого мне нужно сделать это: 'dvc.dataArguments = [[NSDictionary alloc] initWithObjectsAndKeys: self.selectedDate, kDateKey, nil];' для получения данных в '- (void) viewWillAppear: (BOOL) animated'. Ahhhh ... –

0

Вы создаете новый контроллер представления в didSelectRowAtIndexPath, и в конце концов вы звоните prepareForSegue метод ... который создаст новый экземпляр, поэтому вы должны установить данные, которые вы хотите отправить в новом контроллере представления в prepareForSegue методе как это.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // 
    if ([[segue identifier] isEqualToString:@"name_of_ur_segue"]) 
    { 
     // Get reference to the destination view controller 
     DetailViewController *detailViewController = [segue destinationViewController]; 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     // Pass any data here ... 
     detailViewController.myDictionary = [self.placeArray objectAtIndex:[indexPath row]]; 
    } 
} 

Edit:

Как вы доступ к данным в методе ViewDidLoad и в прошивке 7 данных, передаваемых как это не доступен в методе ViewDidLoad. Поскольку логика представления контроллера представлений бит теперь изменилась. Теперь мы можем передавать данные в initMethod, если мы хотим получить доступ к этому в viewDidLoad. Или получить к нему доступ в viewWillAppear или viewDidApepar. Если вы хотите вызвать этот код только один раз в viewDidAppear или ViewWillApepar, просто установите флаг boolean, который может определить, хотите ли вы получить доступ к этому или нет.

+0

Не работает, просто можно увидеть данные в NSlog того же viewController. – Vishal

+0

Показать код из detailViewController, поэтому я могу видеть, что вы делаете с этими данными и где. На самом деле в iOS 7, если вы будете получать данные, которые передаются, как это в ViewDidLoad, methodyou получит нулевой ответ. Вы должны получить доступ к этим данным после viewDidLoad в viewWillAppear или ViewDidAppear ... –

+0

Я добавил только в viewDidLoad, что мне делать? – Vishal

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