2010-11-21 3 views
3

요약 : 나는 내 창 "기본"보기의 하위보기로 UITableView을 사용하려고합니다. 그것은 나타납니다,하지만 난 창을 스크롤 할 때 다음과 같은 오류 메시지가 얻을 : 내 응용 프로그램 위임에 의해로드 된 NIB 파일을 해당과 내가 ViewController의 서브 클래스가NIB에서 하위보기로 UITableView와 관련된 문제가 발생했습니다.

2010-11-20 17:17:51.958 xwtf[6997:207] -[NSCFString tableView:cellForRowAtIndexPath:]: unrecognized selector sent to instance 0x5f46550

합니다. 그것은 전형적인 새 프로젝트 템플릿입니다. 해당 NIB 파일에서 하위보기로 UITableView을 추가합니다. Interface Builder에서는 전체 창을 차지하도록 크기를 조정합니다 (즉, 상위 뷰와 완전히 겹치게).

이제 데이터 원본 및 대리인을 지정해야합니다. 내가 지금처럼 DumbTableHelper라는 클래스를 만듭니다

@interface DumbTableHelper : NSObject<UITableViewDelegate, UITableViewDataSource> { 
} 

그래서, 그것은 UIViewController의 서브 클래스 아니지만, 나는이 간단한 유지하기 위해 노력하고있어 - 내가 필요로하는 모든이를 호출 할 수있는 위임 및 데이터 소스 , 권리? 이외에도 dealloc에서 그하는 .m 파일에 내 방법은 다음과 같습니다

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section { 
    return 10; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"DumbTableCell"; 
    UITableViewCell *cell = [tableView 
          dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier] 
      autorelease]; 
    } 
    return cell; 
} 

당신이, 심지어 어떤 셀을 구성 아니에요 볼 수 있듯이, 10 열만 지정하면 스크롤을 강제 실행하기에 충분합니다. 어쨌든 Interface Builder에서 라이브러리의 객체를 내 NIB로 드래그합니다. 그런 다음 클래스 이름을 DumbTableHelper으로 변경하고 데이터 소스로 지정하고 이미 UITableView의 델리게이트로 지정합니다. 실행하면 표가 나타납니다. 나는 테이블 아래로 스크롤 할 때 내가 얻을 :

010-11-20 18:19:54.673 xwtf[6997:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString tableView:cellForRowAtIndexPath:]: unrecognized selector sent to instance 0x5f46550' 
*** Call stack at first throw: 
(
0 CoreFoundation      0x0259eb99 __exceptionPreprocess + 185 
1 libobjc.A.dylib      0x0239340e objc_exception_throw + 47 
2 CoreFoundation      0x025a06ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
3 CoreFoundation      0x025102b6 ___forwarding___ + 966 
4 CoreFoundation      0x0250fe72 _CF_forwarding_prep_0 + 50 
5 UIKit        0x00321d6f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 619 
6 UIKit        0x00317e02 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75 
7 UIKit        0x0032c69f -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1348 
8 UIKit        0x003247ec -[UITableView layoutSubviews] + 242 
9 QuartzCore       0x0455c481 -[CALayer layoutSublayers] + 177 
10 QuartzCore       0x0455c1b1 CALayerLayoutIfNeeded + 220 
11 QuartzCore       0x045552e0 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 302 
12 QuartzCore       0x04555040 _ZN2CA11Transaction6commitEv + 292 
13 QuartzCore       0x04585ebb _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 
14 CoreFoundation      0x0257ff4b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 
15 CoreFoundation      0x02514b27 __CFRunLoopDoObservers + 295 
16 CoreFoundation      0x024ddce7 __CFRunLoopRun + 1575 
17 CoreFoundation      0x024dd350 CFRunLoopRunSpecific + 208 
18 CoreFoundation      0x024dd271 CFRunLoopRunInMode + 97 
19 GraphicsServices     0x02d5d00c GSEventRunModal + 217 
20 GraphicsServices     0x02d5d0d1 GSEventRun + 115 
21 UIKit        0x002beaf2 UIApplicationMain + 1160 
22 xwtf        0x00001af4 main + 102 
23 xwtf        0x00001a85 start + 53 
) 

그래서 그것은 .. 문자열에 tableView:cellForRowAtIndexPath:를 호출하는거야? 누구든지 아이디어가 있습니까?

이것이 바보 같은 질문 인 경우 유감스럽게 생각합니다. 지금까지 모든 테이블보기는 프로그래밍 방식으로 UITableViewController 인스턴스로 생성되었지만 지금은 서브 뷰로 UITableView을 추가해야합니다. 전체 화면을. 나는 테이블 뷰와 시작하는 iPhone 개발에 대한 Apple 가이드를 읽었습니다. 나는 아무것도 놓치지 않으려 고했지만 아무 소용이 없는지 확인했습니다.

감사합니다!

+0

이 버그가 생길 때와 같은 문제가 있다고 가정하고 있습니다. '- [CALayer tableView : cellForRowAtIndexPath :] : 인식 할 수없는 셀렉터가 인스턴스 0x14563c90으로 전송되었습니다.'즉, 'NSCFString'보다는 'CALayer' 전에도 NSCString이이 같은 문제로 떠올랐다는 것을 맹세 할 수 있습니다.) .. 'CALayer'가 있다면 호크. – abbood

답변

4

좋아요, 이유를 알아 냈습니다. ViewController의 하위 클래스에는 NIB 파일의 파일 소유자로도 사용되며 DumbTableHelper에 신고 된 콘센트가 없습니다. http://developer.apple.com/library/mac/documentation/cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html에서 펜촉 파일에 리소스 프로그래밍 가이드는 말한다 : nib 파일에

객체 1의 유지 수로 만든 다음, 오토 릴리즈 있습니다 ... 당신이 펜촉 파일 개체에 대한 출구를 정의하면, 당신은 항상 정의해야 그 콘센트에 액세스하기위한 setter 메서드 (또는 선언 된 속성). 아웃렛의 세터 메소드는 값을 유지해야하며 최상위 레벨 객체가 포함 된 아웃렛의 세터 메소드는 할당 해제되지 않도록 값을 유지해야합니다. 테이블이 먼저 표시된 경우

DumbTableHelper 여전히 하나의 retainCount 가지며 아직 오토 릴리즈되지하므로는 처음 표시되는 행을 채우기 위해 사용될 수있다.그러나 스크롤 할 때 더 이상 메모리에 존재하지 않습니다. 스택 추적에서 문자열이 DumbTableHelper 인 메모리 주소에 할당되었다고 추측 할 수 있으므로 tableView:cellForRowAtIndexPath: 메시지를 잘못 수신합니다.

다시 말하면 단순히 파일 소유자의 콘센트를 Interface Builder 파일의 DumbTableHelper 인스턴스에 연결하면 문제가 해결됩니다.

+0

험 .. .. 흥미 롭습니다 ..하지만 두 가지 질문이 있습니다 : 1. 하나는 이것이 자동으로 ARC를 사용하여 해결해야하는 문제라고 가정합니다 (나는 당신의 alloc dealloc 참조에서 이것이 비 ARC 코드라는 것을 유추합니다).) .. 물건은 내가 * 오전 * ARC를 사용하여하지만 여전히 동일한 문제가 생겼어 2. 귀하의 경우 단순히 스토리 보드에서 데이터 소스 콘센트를 참조 할 수 있습니다. b/c 데이터 소스가 단일이고 정의 된 것입니다. 런타임에 정의 된 데이터 소스 (내가 무엇을하는지 .. 다른 데이터 소스와 동일한 uitableviewcontroller/tableview를 사용하고 있습니다)? 어떻게 그걸 처리하니? – abbood

0

Interface Builder에서 연결을 삭제하고 다시 설정하는 것이 좋습니다. 확실히 dataSource 콘센트가 펜촉의 NSString에 연결되어있는 것 같습니다. UITableView의 delegate와 datasource 속성을 사용하여 코드로 연결을 시도해 볼 수도 있습니다.

+0

도움을 주신 CrystalSkull! 오늘 오후에 더 조사를 한 후에 그 이유를 발견했습니다. 문자열 인스턴스는 빨간색 청어, 정말 ... 자세한 내용은 내 대답을 참조하십시오. – shadowmatter

관련 문제