2013-05-17 3 views
1

나는 Stackoverflow에서 비슷한 질문을 많이 보았고 많은 일을 시도했지만이 사실을 알 수없는 것 같습니다. 여러 TableViewControllers 및 1 MainViewController 있습니다. MainViewController는 다른 TableViewController를 호출하는 버튼을 가지고 있으며, tableViewController가 해제하는 tablecell을 선택하면됩니다.Xcode/Obj-c - Segue가 새로운 인스턴스를 푸시

문제점은 내 tableViewController 중 하나에서 푸시 할 때마다 내 MainViewController의 새 인스턴스를 푸시하는 것이 문제입니다. 현재 Segues를 사용하여 다른 컨트롤러 사이를 밀고 있습니다.

요약 : TableViewControllers에서 ViewController로 전환 할 때 이전의 데이터 입력을 제거하기 때문에 ViewController가 새 인스턴스로 푸시되지 않도록하고 싶습니다. 클래스에

[self dismissModalViewController: withCompletion:] 
performSegue 
prepareForSegue 

또는 설정 일부 글로벌 변수와 그 부르지 만 올바르게 구현 아직 충분히 경험하지 메신저 :

임 확신 내가 하나를 사용해야합니다.

최종 결과의 간단한 예는 다음과 같습니다. VC의 텍스트 필드 3 개. textfield1을 클릭하면 tableview1이 열리고 셀을 클릭하면 textfield1이 업데이트됩니다. Textfield2는 tableview2 등을 엽니 다.

희망이 있다면, 필요한 경우 샘플 코드를 게시 할 수 있습니다.

편집, 코드를 게시 (명심를 segues는 스토리 보드에서 수행됩니다) : TableViewExample.h을 :

@interface IndustryViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> { 

NSArray *tableViewArray;} 
@property (nonatomic, strong) IBOutlet UITableView *tableViewIndustry; 

TableViewExample.m : 다음

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
if ([segue.identifier isEqualToString:@"showIndustry"]) { 
    NSIndexPath *indexPath = [self.tableViewIndustry indexPathForSelectedRow]; 
    ViewController *destViewController = segue.destinationViewController; 
    destViewController.industryText = [tableViewArray objectAtIndex:indexPath.row]; 
    destViewController.industryTextName = [tableViewArray objectAtIndex:indexPath.row]; 
}} 

ViewController.m,있는 viewDidLoad에서 :

[industry setTitle:industryText forState:UIControlStateNormal]; 

내가 생각하기에 가장 중요한 부분이다.

+0

yor code를 게시하십시오. – Kasaname

+0

어떤 종류의 Segue를 사용하고 있습니까? '모달'? –

+0

더 자세한 정보가 필요하면 알려주세요. – Tarayaa

답변

1

"밀어 넣기"유형이 맞습니까? SEGUE 유형 "모달"이다

[self.navigationController popViewControllerAnimated:YES]; 

경우 대신 당신이 당신의 테이블 뷰 컨트롤러에 이런 일을 수행해야합니다 : 관해서

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // your logic here 
    [self dismissModalViewControllerAnimated:YES]; 
} 

당신은 사용하여 테이블 뷰 컨트롤러를 기각 시도해야하므로 경우 나는 개인적으로 다음과 같이, 테이블 뷰 컨트롤러의 헤더 파일에 공용 속성을 만드는 어떻게 할 것인지 컨트롤러 간의 데이터 교환 :

@property (nonatomic, weak) <Your_UIViewController_Subclass_Here> *mainController 

보다가, 메인 컨트롤러에서 prepareForSegue를 오버라이드 (override) : 보낸 사람 : 새로 생성 된 속성을 설정하는 방법을 다음과 같이 메인 컨트롤러를 가리 키도록 :

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    <Your_Subclass_Of_UITableViewController_Here> *destinationController = segue.destinationController; 
    destinationController.mainController = self; 
} 

을 이제 테이블보기 컨트롤러 보내 주 제어기에 대한 포인터를해야합니다 데이터는 기본적으로 사용자가 텍스트 필드 나 다른 데이터 모델의 텍스트를 업데이트하기 위해 테이블 ​​뷰 컨트롤러에서 테이블 뷰 행을 선택할 때 호출되도록 메인 컨트롤러에 public 메서드 나 속성을 구현하는 것입니다. 사용하고 있습니다.

+0

푸시 세그 (Push Segue)의 경우, 잘못 사용하고있는 경우 네비게이션 컨트롤러를 사용해야합니다. 따라서 segue는 "modal"/ "popover"유형입니다. Push Segues와 함께 Navigation Controller를 사용하면 효과가 있습니까? – Tarayaa

+0

예, 세그먼트가 수행 될 때 탐색 컨트롤러에 포함 된 경우 이전 컨트롤러의 인스턴스가 보존되므로 세그먼트가 연결된보기 컨트롤러를 팝업 할 때 세그먼트를 시작한 컨트롤러와 동일한 컨트롤러가 표시됩니다. 나는 모달에서도 당신이하려고하는 것을 할 수 있어야한다고 생각하지만 항상 거의 항상 섹스를 사용합니다. – BigLex

+0

나는 곧바로이 일을 시작할 것이다. – Tarayaa

관련 문제