2012-11-21 2 views
2

그래, 이전에 물어 봤지만 나는이 작업을하기 위해 여러 가지 방법을 시도했지만 어떤 이유로는 그렇지 않을 것입니다. 레이블의 텍스트 속성에 문자열을 저장하려고합니다. 이 레이블은 컨테이너보기 내의 tableVC이라는 하위보기 컨트롤러에 있으며 UIDatePicker의 값인 datePicker이 변경되면 IBAction에서 ViewController이라는 parentViewController에서 레이블을 설정합니다.자식보기 컨트롤러 속성 설정

tableVC *tVC = [[tableVC alloc] init]; 
tVC.timeLabel.text = [formatter stringFromDate:self.datePicker.date]; 

를 또한 다음 일을 속성 @property (strong, nonatomic) tableVC *tVC;을 시도했다 : 나는 시도

_tVC = [tableVC alloc] init]; 
_tVC.timeLabel.text = [formatter stringFromDate:self.datePicker.date]; 

하지만 그 중 하나가 작동하지 않습니다. 안녕, 난 #import "tableVC" 있습니다. 복잡한 노 띾색이나 프로토콜 방식으로 멍청한 실수를하고 있다고 생각하지 않습니다. 또한 NSLog(@"%@", [formatter stringFromDate:self.datePicker.date]);을 사용하여 [formatter stringFromDate:self.datePicker.date]이 datePicker에서 적절한 형식 (nil 이외의 형식)의 값을 반환한다는 것을 확인했습니다.

편집 여기

는 전체 파일과 함께 좀 더 정보입니다. 이 테이블은 Storyboard에 정의 된 정적 테이블입니다. 나는 이것이 문제의 원인이 될 수 있다고 생각했지만 심지어 tableVC을 서브 클래스 UIViewController에 대해 하나의 레이블로 대체했을 때 작동하지 않았습니다. 문제는 자식보기 컨트롤러 속성을 설정하는 방법에 있다고 생각합니다. 그러나 다른 프로젝트에서 prepareForSeque 메서드를 사용할 때이 문제가 발생하지 않습니다. 대상 컨트롤러의 속성 값을 설정할 수 있지만 대상 컨트롤러가 아닌보기 컨트롤러의 속성 값은 문제가되지 않습니다. 나는이 두 가지 문제가 동시에 일어난다 고 생각한다. 모든 연결은 스토리 보드를 통해 적절하게 이루어졌습니다.

ViewController.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

@end 

ViewController.m

#import "ViewController.h" 
#import "tableVC.h" 

@interface ViewController() 

@property (weak, nonatomic) IBOutlet UIView *containerView; 
@property (weak, nonatomic) IBOutlet UILabel *testLabel; 
@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker; 

- (IBAction)changedDatePickerSelection:(id)sender; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    tableVC *tVC = [[tableVC alloc] init]; 
    [self addChildViewController:tVC]; 
    [tVC didMoveToParentViewController:self]; 

    NSLog(@"parent"); 
} 

- (IBAction)changedDatePickerSelection:(id)sender 
{ 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    formatter.timeZone = [NSTimeZone defaultTimeZone]; 
    formatter.timeStyle = NSDateFormatterShortStyle; 
    formatter.dateStyle = NSDateFormatterMediumStyle; 

    tableVC *tVC = (tableVC *)self.childViewControllers.lastObject; 
    tVC.timeLabel.text = [formatter stringFromDate:self.datePicker.date]; 

    _testLabel.text = [formatter stringFromDate:self.datePicker.date]; 

    NSLog(@"%@", [formatter stringFromDate:_datePicker.date]); 
    NSLog(@"%@", tVC.timeLabel.text); 
} 

@end 

tableVC.h

#import <UIKit/UIKit.h> 

@interface tableVC : UITableViewController 

@property (weak, nonatomic) IBOutlet UILabel *timeLabel; 

@end 

tableVC.m

#import "tableVC.h" 
#import "ViewController.h" 

@interface tableVC() 

@property (weak, nonatomic) IBOutlet UITextField *titleTextField; 
@property (weak, nonatomic) IBOutlet UISwitch *onOffSwitch; 
@property (weak, nonatomic) IBOutlet UIButton *saveButton; 

- (IBAction)saveAlarm; 

@end 

@implementation tableVC 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    formatter.timeZone = [NSTimeZone defaultTimeZone]; 
    formatter.timeStyle = NSDateFormatterShortStyle; 

    _timeLabel.text = [formatter stringFromDate:[NSDate date]]; 
    NSLog(@"%@", _timeLabel.text); 
} 

- (BOOL)textFieldShouldReturn:(UITextField*)aTextField 
{ 
    [aTextField resignFirstResponder]; 
    return YES; 
} 

- (IBAction)saveAlarm 
{ 
    // do something 
} 

@end 
,

또한 datePicker의 선택이 변경되었을 때 ViewControllertestLabel이 어떻게 업데이트되는지 보여주는 두 개의 이미지가 있지만 tableVCtimeLabel은 어떻게 변경되지 않았는지를 보여줍니다. 첫 번째 이미지는 선택 변경 전이고 두 번째 이미지는 후입니다. 설명을 위해 timeLabel은 세 번째 셀의 오른쪽에있는 레이블이고 testLabeldatePicker 바로 위에있는 레이블입니다. 어떤 도움

http://cl.ly/image/2Q301v0d2m00

http://cl.ly/image/0223183E1t2m

감사합니다.

+0

'timeLabel' 속성은 어떻게 생겼습니까? – mkral

+0

@mkral'@property (weak, nonatomic) IBOutlet UILabel * timeLabel; ' –

+0

프로그래밍 방식으로 또는 interfaceBuilder를 사용하여'tableVC'를 추가 하시겠습니까? 인터페이스 빌더를 사용하는 경우 모든 매장을 연결하고 있습니까? – mkral

답변

4

, 당신은 이런 식으로 작업을 수행 할 수 있습니다 lastObject 대신 objectAtIndex를 사용하십시오.

편집 후 : 이것은 내가 한 일입니다.

#import "ViewController.h" 
#import "TableVC.h" 

@interface ViewController() 

@property (weak, nonatomic) IBOutlet UIView *containerView; 
@property (weak, nonatomic) IBOutlet UILabel *testLabel; 
@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker; 
@property (strong,nonatomic) NSDateFormatter *formatter; 
@property (strong,nonatomic) TableVC *tVC; 

- (IBAction)changedDatePickerSelection:(id)sender; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.formatter = [[NSDateFormatter alloc] init]; 
    self.formatter.timeZone = [NSTimeZone defaultTimeZone]; 
    self.formatter.timeStyle = NSDateFormatterShortStyle; 
    self.formatter.dateStyle = NSDateFormatterMediumStyle; 

    self.tVC = (TableVC *)self.childViewControllers.lastObject; 
} 

- (IBAction)changedDatePickerSelection:(id)sender { 

    self.tVC.timeLabel.text = [self.formatter stringFromDate:self.datePicker.date]; 
    _testLabel.text = [self.formatter stringFromDate:self.datePicker.date]; 
} 

나보다 다른 TableVC에서 아무것도 변경하지 않은 : 새로운 포매터 init을 당신이 날짜 선택을 변경할 때마다 ALLOC 할 필요가 없기 때문에, 몇 가지 속성을 추가하고있는 viewDidLoad에 일부 코드를 이동 이름을 대문자로 바꿉니다 (실제로 클래스 이름을 대문자로 사용해야합니다).

+0

불행히도 이것은 작동하지 않았습니다. 자세한 내용은 개정 된 게시물을 참조하십시오. 도와 주셔서 감사합니다. –

+0

@MusicMathTech, 방금 게시 한 모든 코드가 문제라고 생각합니다. 컨테이너 뷰를 추가하여 IB에서 이것을 설정하면 자동으로 임베디드 컨트롤러가 제공되므로 하위 뷰 컨트롤러를 설정하는 코드가 필요하지 않습니다. init tVC를 할당 한 다음 하위 뷰 컨트롤러로 추가하는 코드는 필요하지 않습니다. – rdelmar

+0

알았어, 나는 alloc init과'addChildViewController'와'didMoveToParentViewController'를 주석 처리했다. 그런 다음 '@property (비 원자력) IBOutlet UIView * containerView'를 주석 처리하고 Storyboard의 컨테이너 뷰에서 콘센트를 제거했습니다. 나는 또한'tableVC * tVC = [[tableVC alloc] init ;;'changedDatePickerSelection'의'table * tVC; '행을 변경했습니다. 여전히 작동하지 않습니다. 어떤 아이디어? 감사. –

0

때마다 당신은 뷰 컨트롤러의 새로운 인스턴스를 만드는 ALLOC/초기화를하고 있습니다. 이미 콘센트 (인터페이스 빌더에 설정되어있는 경우)를 사용하여 이미 화면에있는 기존 인스턴스에 대한 포인터가 필요합니다.하나 이상의 자녀가있는 경우

tableVC *tVC = (tableVC *)self.childViewControllers.lastObject; 
tVC.timeLabel.text = ....; 

하면, 당신은 하나가 당신이 원하는 하나입니다 파악해야하고, : 당신이 하나의 아이 뷰 컨트롤러가있는 경우

+0

나는 당신이 의미하는 것이 확실하지 않습니다. 스토리 보드를 사용하고 있습니다. –