2011-09-26 3 views
4

userList라는 NSMutableArray에서 채워진 데이터가있는 UITableViewController가 있습니다. 특정 사용자를 선택하면 상세 뷰로 이동하고 NavBar에서 제목을 업데이트하지만 UIView에서 UILabel을 업데이트하기 위해 데이터를 전달하지 않습니다. 테이블 뷰에서 선택한 후 상세 뷰로 데이터를 전달하는 방법은 무엇입니까?

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

[tableView deselectRowAtIndexPath:indexPath animated:NO]; 

//Attempt at a singleton to pass the data 
DetailView *details = [[DetailView alloc] init]; 
details.userNameLbl = [userList objectAtIndex:indexPath.row]; 


DetailView *detailVC = [[DetailView alloc] initWithNibName:nil bundle:nil]; 

//This line doesn't pass the data 
detailVC.userNameLbl.text = [userList objectAtIndex:indexPath.row]; 

//This line does update the title in the NavBar 
detailVC.navigationItem.title = [userList objectAtIndex:indexPath.row]; 

[self.navigationController pushViewController:detailVC animated:YES]; 

[details release]; 
[detailVC release]; 

} 

나는 상세 뷰에 테이블 뷰의 데이터를 넣거나, 테이블 뷰에서 데이터를 당겨 상세보기 시도를하는 것을 시도해야 하는가?

DetailView.h에는 실제로 IB에 연결되는 다음 줄이 있습니다.

IBOutlet UILabel *userNameLbl 

답변

11

userNamelbl은 뷰가 nib 파일에서로드 될 때까지 인스턴스화되지 않습니다. 이것은 초기 설정시 즉시 발생하지 않지만 viewDidLoad이 호출 될 때까지 발생합니다.

따라서 DetailView에서 제목을 저장하기 위해 속성을 선언 한 다음 viewDidLoad 메서드에서 해당 값을 userNamelbl.text에 할당해야합니다. 예를 들어

, 테이블에서의 ViewController :

DetailView *detailVC = [[DetailView alloc] initWithNibName:nil bundle:nil]; 
detailVC.userName = [userList objectAtIndex: indexPath.row]; 

하고 자세하게의 ViewController 다음의 ViewController가 초기화 될 때의 ViewController의 navigationItem 속성이 생성됩니다

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.userNameLbl.text = self.userName; 
} 

, 따라서 당신이에

할당 할 수 있습니다 navigationItem.title 즉시.


스위프트 코드

let detailVC = DetailView(nibName: nil, bundle: nil) 
detailVC.userName = userList.objectAtIndex(indexPath.row) as? NSString 

class DetailView: UIViewController { 

    @IBOutlet var userNameLbl: UILabel 
    var userName:NSString? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.userNameLbl.text = self.userName 
    }  
} 
+0

또한,'User' 클래스가 있고 그 인스턴스를 뷰에 전달하는 것을 고려할 수 있습니다. 그런 다음 뷰는 사용자에게 특정되는 자체의 모든 부분을 초기화 할 수 있습니다. 이 'User' 클래스를 Core Data 엔터티 유형으로 만드는 것도 도움이 될 수 있습니다. – George

+0

이렇게하면 유형에 대한 NSString 및 UILabel 불일치에 대한 경고가 발생합니다. 솔루션을 구현하고이를 방지 할 수있는 방법이 있습니까? – tarheel

+0

userList가 NSString의 배열이라고 가정했습니다. userName 속성도 NSString 일 경우에는 불일치가 없어야합니다. –

0

아마도 DetailView에는 선택한 행의 데이터가 작동해야합니까?

그렇다면 '올바른'방법은 사용자가 필요로하는 데이터를 전달하는 사용자 지정 init 메서드를 만드는 것입니다. 예를 들면 :

[[DetailView alloc] initWithTitle:(NSString *)title text:(NSString *)text] 

이 당신의 접근 방식과 본질적으로 아무 문제가 없다, 그러나 그것의 창조에서 뷰 컨트롤러에 필요한 데이터를 전달하는 것은 구조적으로 더 나은 (제 생각에, 나는 누군가가 동의하지 않을 것이라 확신합니다!). 예를 들어, 테이블 뷰 컨트롤러를 생각해보십시오 - init 메서드의 테이블 뷰 스타일을 전달하면 나중에 설정하지 않습니다. UIImageView과 동일 - 이미지를 만들 때 설정할 수있는 initWithImage 방법이 있습니다.

+0

C 사실적으로, 나는 당신의 접근에 분명 동의하지만 구현에 조금 더 많은 도움이 필요하다. 나의 이해는 위의 라인이 내 didSelectRowAtIndexPath : TableView의 메소드로 들어가고, (이것은 퍼지가된다) initWithTitle : text : 메소드의 실제 구현이 DetailView에 있어야한다는 것이다. 권리? – tarheel

+0

+1이 방법에 대한. 나는 단순함과 우아함 때문에 언급 된 다른 접근법보다 이것을 추천 할 것이다. – Bourne

+0

@lxt 저는이 솔루션에 대해 더 많이보고 싶습니다.하지만 애쉴리 밀스에 대한 크레딧을 주어야했습니다. 그게 내 앱에서 함께 간 해결책 이었기 때문입니다. 모두에게 감사드립니다! – tarheel

4

당신은 UIViewsUIViewControllers을 혼합하고 있습니까? UIViewController 또는 일부 서브 클래스 (예 : UITableViewController)를 상속하는 DetailViewController 클래스가 있어야합니다. 수업을 선언하고 정의하려면 DetailViewController.mDetailViewController.h 개의 파일이 있어야합니다. UIViewController이로드되는 UIView을 정의하는 해당 펜촉이 있어야합니다. 파일은 DetailView.xib입니다.

사용자 이름 값을 할당해야 할 때 UIView이로드되지 않았기 때문에 UILabel에 직접 값을 할당 할 수 없습니다.

원하는 것을 수행하려면 마스터 컨트롤러에서 상세보기 컨트롤러로 값을 "밀어 넣기"위해 공용 속성 (userName)을 선언해야합니다. 상세 뷰가로드되면 속성의 값을 레이블 및 탐색 모음에 지정할 수 있습니다. 마스터 뷰 컨트롤러

(UITableViewController)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tableView deselectRowAtIndexPath:indexPath animated:NO]; 

    DetailViewController *detailVC = [[DetailView alloc] initWithNibName:@"DetailView" bundle:nil]; 

    detailVC.userName = [userList objectAtIndex:indexPath.row]; 

    [self.navigationController pushViewController:detailVC animated:YES]; 

    [detailVC release]; 
} 

하여 상세보기 제어기 :

DetailViewController.h

@property (retain) NSString* userName; 
@property (nonatomic, retain) IBOutlet UILabel *userNameLbl; 

DetailViewController.m

@synthesize userName; 
@synthesize userNameLbl; 

-(void) viewDidLoad { 
    [super viewDidLoad]; 
    self.userNameLbl.text = self.userName; 
    self.navigationItem.title = self.userName; 
} 
관련 문제