2014-09-12 3 views
0

전 Objective-C, XCode 및 iOS 개발을 처음 접했고 모든 UI보기 및 컨트롤이 인스턴스화 된 후 시작시 특정 코드를 실행하는 방법을 파악하려고합니다. . 인터페이스 빌더를 통해 뷰 컨트롤러 장면으로 드래그하여 추가 한 일반 NSObject가 있습니다. 다음과 같이 정의됩니다 :보기 컨트롤러에서 인터페이스 빌더 객체에 액세스

#import <Foundation/Foundation.h> 

@interface Controller : NSObject { 
    IBOutlet UISlider *slider;   
    IBOutlet UILabel *label; 
} 

-(IBAction)sliderChanged:(id)sender; 

@end 

초기화시 sliderChanged를 실행해야합니다. 나는 다음과 같은 방법을 시도했다 :

#import "Controller.h" 

@implementation Controller 

-(id)init { 
    self = [super init]; 
    if (self){ 
     [self sliderChanged:nil]; 
    } 
    return self; 
} 
// More code here 

그러나이 때 나는 내 슬라이더와 라벨이 모두 nil이다. 거기에 ViewController 클래스 내에서 viewDidLoad 메서드는 이해하지만 내 Controller 클래스 (인터페이스 작성기에 의해 장면 뒤에 어딘가에 인스턴스화 된 것 같다) 인스턴스를 액세스하는 방법을 잘 모르겠습니다. 방법. 이 코드는 모두 ViewController으로 이동해야합니까? 그것은 의미가있는 것처럼 보일 것입니다. 그러나 위의 디자인은 우리가 수업 시간에 지시 한 것입니다. 그래서 이것을 어떻게 할 것인지 잘 모르겠습니다.

답변

2

XIB/Storyboard 로더가 모든 개체를로드하고 배선을 완료하면 XIB에서 인스턴스화 한 모든 개체에 awakeFromNib을 보냅니다. 그래서 Controller 클래스에 이것을 추가하려고 :

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    [self sliderChanged:nil]; 
} 

당신은 NSObject UIKit Additions Reference“The Nib Object Life Cycle” in the Resource Programming Guide에서 자세한 정보를 확인하세요. 당신이 최상위 개체로 Controller를 생성, 당신은 모든 출구를 를 연결하지 않은 경우

그러나이, 그 다음 아무것도 XIB 로더가 그것으로 완료, 그래서 시스템이 할당을 해제합니다 후를 참조하지 다시. 아마 원하는 것이 아니기 때문에보기 컨트롤러의 콘센트를 Controller에 연결해야합니다. 당신이 그렇게 (과의 콘센트가 controller라는 가정 해 봅시다) 경우에, 당신은 당신의 뷰 컨트롤러 클래스에 viewDidLoad에 액세스 할 수 있습니다

#import <UIKit/UIKit.h> 
#import "Controller.h" 

@interface ViewController : UIViewController { 
    IBOutlet Controller *controller; 
} 
@end 

구현 : 내가 필요 정확히 무엇을

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self.controller sliderChanged:self]; 
} 
+0

두 번째 솔루션 . 건배! –

관련 문제