2016-09-23 4 views
0

Я знаю, что этот вопрос задан, но я прочитал ответы, принял исправления и все еще имею проблему где-то, что я не могу определить.IOS Obj-C ViewController не передается значение

У меня есть приложение IOS, которое похоже на электронную почту. Он имеет InboxVC, который является tableVC с пользовательской ячейкой прототипа, которая после выбора запускает messageDetailVC.

Проблема в том, что сообщениеDetailVC запускается, но значения не передаются ему. Я добавил сообщения журнала, чтобы оценить значение в коде, прежде чем обращаться к проблемам раскадровки, а передаваемая переменная (messageID) имеет значение NULL.

Может ли кто-нибудь сказать мне, что мне не хватает или что-то не так? Мой код:

InboxVC.m (фрагмент)

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

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    NSLog(@"%@: Message touched...", LOG_TAG); 
    messageDetail *mdvc = [[messageDetail alloc] init]; 
    mdvc.messageID = @"123456789-1"; 
    [self.navigationController pushViewController:mdvc animated:YES]; 
    NSLog(@"%@: messageID value is = %@",LOG_TAG,mdvc.messageID); 
    //messageID has valid value here 
} 

messageDetail.h

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@interface messageDetail : UIViewController 
{ 
    NSString *messageID; 
} 

@property (strong, nonatomic) NSString *messageID; 
@property (strong, nonatomic) IBOutlet UITextView *body; 

messageDetail.m

#import <Foundation/Foundation.h> 
#import "messageDetail.h" 

static NSString * LOG_TAG = @"messageDetailController"; 

@implementation messageDetail 

@synthesize messageID; 
@synthesize body; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    body.text = messageID; 
    //debug messages 
    NSLog(@"%@:Added messageID as Body text", LOG_TAG); 
    NSLog(@"%@:Value of body.text is = %@", LOG_TAG, body.text); 
    NSLog(@"%@:Value of messageID is = %@", LOG_TAG, messageID); 
    //messageID has null value here 
} 

- (void) viewWillAppear:(BOOL)animated { 
    [self.navigationController setNavigationBarHidden:NO]; 

} 

MainStoryboard:

У меня есть сообщениеDetail view, связанное с сообщением Подкласс класса UIViewController. Существует сегмент с идентификатором «s_msgDetail» из события выбора ячейки прототипа в messageDetailVC (показ). Как я уже сказал выше, появляется сообщение MessageDetailVC, но не с телом body.text, установленным на значение «messageID».

+0

возможно, код в viewDidLoad выполняется до этой строки: mdvc.messageID = @ "123456789-1"; Правильный способ сделать это - это настраиваемый метод init, который принимает любые входные параметры, которые вы хотите передать вперед. – Woodstock

ответ

0

Вы устанавливаете messageID в неправильном экземпляре своего контроллера messageDetail. Поскольку вы используете раскадровки, раскадровка уже создает и представляет для вас экземпляр messageDetail. Но в tableView:didSelectRowAtIndexPath: вы создаете вторую и представляете ее. (Я удивлен, что вы не получаете кучу времени выполнения анимации предупреждений при выполнении этого.)

Вы должны быть настройки messageID в prepareForSegue:sender: так:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"s_msgDetail"]) { 
     messageDetail * vc = (messageDetail *) segue.destinationViewController; 
     NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow]; 
     vc.messageID = /* use indexPath to get data from messages collection */; 
    } 
} 
+0

спасибо за ответ. Я не получил электронное письмо, на которое кто-то ответил. Я много читал о подготовкеForSegue, поскольку это был правильный подход, но я действительно пытался это сделать и не мог заставить его работать. Я дам вашему фрагменту попробовать ... – Rob

0

Вы должны использовать prepareForSegue передать значение к другому виду Контроллер

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