2014-01-14 2 views
1

viewcontroller에서 viewcontroller으로 전송하려는 데이터로 오버로드하는 대신 프로젝트를보다 체계적으로 유지하고 싶습니다. 더 체계적인 방식으로 유지하는 데 도움이되는 모델 클래스를 만들고 싶습니다. 그러나 모델을 사용할 때 컨트롤러간에 데이터를 전송하는 데 어려움을 겪고 있습니다. 이 nsstring 데이터를 ViewController1에서 ViewController2으로 전송할 때 내 방식의 오류를 보여 주시겠습니까? 추신 내 실제 프로젝트가 좀 더 어수선하기 때문에이 모범을 보였으므로 어떤 모순이든 미리 사과드립니다.ViewControllers간에 데이터를 전송하는 데 도움이 필요합니다.

ViewController2.m 

에서 NSLog보고 널 (null)에 다음과 같은 결과 ViewController1.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
ViewController2 *viewController2 =[[ViewController2 alloc]init]; 
ViewControllerModel *vcm = [self.array objectAtIndex:indexPath.row]; 

NSLog(@"%@",vcm.string) // this will output a number 

[self.navigationController pushViewController:viewController2 animated:YES]; 
} 
// this delegate fetches an array of json data 
-(void)fetchedResults:(NSMutableArray*)arrayList{ 
self.array = arrayList; 
} 

ViewController2.m

- (void)viewDidLoad 
    { 
    ViewControllerModel *vcm = = [[ViewController alloc] init]; 
    [super viewDidLoad]; 
    NSLog(@"%@",vcm.string); // this will output null. 
    } 

ViewControllerModel .H # import를

@interface ViewControllerModel : NSObject 
    @property (nonatomic, strong) NSString *string; 

    @end 

ViewControllerModel.m

#import "ViewControllerModel.h" 

    @implementation ViewControllerModel 
    @synthesize string; 

    @end 

MyHandler.m

//this is where vcm.string in ViewController1.m will get all the numbers not sure if this is needed but just in case . 

    for (NSDictionary *dict in responseArray) 
    { 
    ViewControllerModel *vcm = [[ViewControllerModel alloc] init]; 

    vcm.string = ([dict valueForKey:@"string"] == [NSNull null]) ? @"" : [NSString stringWithFormat:@"%@",[dict valueForKey:@"string"]]; 

답변

1

확인을 다음과 같이 변경 :

ViewController1.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    ViewController2 *viewController2 =[[ViewController2 alloc]init]; 
    ViewControllerModel *vcm = [ViewControllerModel alloc] init]; 
    vcm.string = @"My String"; 
    viewController2.vcm = vcm; 

    NSLog(@"%@",vcm.string) // this will output a number 
    [self.navigationController pushViewController:viewController2 animated:YES]; 
} 

// this delegate fetches an array of json data 
- (void)fetchedResults:(NSMutableArray*)arrayList{ 
    self.array = arrayList; 
} 

ViewController2.h

@interface ViewController2 : NSObject 
@property (nonatomic, strong) ViewControllerModel *vcm; 
@end 

나는 또한 다음과 같은 개선 사항을 추천 할 것입니다

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"%@", self.vcm.string); 
} 

ViewController2.m.

  1. 현재로서는 모델 개체가 필요하지 않습니다. ViewControllerModel 객체 대신 ViewController2에 NSString 속성으로 문자열을 추가하면됩니다.

    @property (nonatomic, copy) NSString * string;

  2. 속성, 모델 객체 및보기 컨트롤러의 이름을 좀 더 구체적으로 지정하는 것이 좋습니다. 견본이라 할지라도 그것을 이해하기 어려울 것입니다.

  3. NSString 속성 (또는 이에 상응하는 변경 가능한 다른 클래스)을 만들 때 '강한'대신 '복사'를 사용하는 것이 좋습니다. NSMutableString이 더 안전한 접근법으로 간주되는 속성에 할당되면 문자열의 불변 사본을 만듭니다.

+0

"@property (nonatomic, strong) NSString * string;"모델 문자열 내에 데이터가 저장되는 방법은 구현할 방법이 있습니까? 그리고 viewcontroller2 문자열 속성을 쓸 필요가 없습니다? 그렇지 않다면 모델 클래스 안에 데이터를 유지하는 것을 선호합니다. – user3192186

+0

그것이 지금하는 일입니다.코드에서 여전히 작동하지 않는 부분은 vcm을 설정하는 곳입니다. 코드의 한 부분 (MyHandler)에 설정하고 다른 부분 (tableView : didSelectRowAtIndexPath :)에 사용하려면 ViewController1에 속성을 만들어야합니다. – Jesse

+0

오케이. 알겠습니다. 그것을 구현합니다. – user3192186

관련 문제