UITableViewCell에서 UITableView를 가져오는 방법은 무엇입니까?
나는 있습니다UITableViewCell
그것은 물체와 연결되어 있고 나는 그 세포가 보이는지 말해야 합니다.로는, 은 제가 든 접속해야 한다는 것을 의미합니다.UITableView
표시 여부를 확인할 수 있는 여러 가지 방법이 있습니다.그래서 저는 궁금해요.UITableViewCell
에 대한 포인터가 있습니다.UITableView
아니면 세포에서 포인터를 얻을 수 있는 다른 방법이 있었습니까?
iOS 버전을 확인하지 않으려면 UITableView를 찾을 때까지 셀 보기에서 슈퍼뷰를 반복적으로 위로 이동합니다.
목표-C
id view = [cellInstance superview];
while (view && [view isKindOfClass:[UITableView class]] == NO) {
view = [view superview];
}
UITableView *tableView = (UITableView *)view;
스위프트
var view = cellInstance.superview
while (view != nil && (view as? UITableView) == nil) {
view = view?.superview
}
if let tableView = view as? UITableView {
tableView.beginUpdates()
tableView.endUpdates()
}
5 iOS7 버전 5UITableViewWrapperView
의 입니다.UITableViewCell
또한 의 개요입니다.
따라서 iOS 7의 솔루션은 다음과 같습니다.
UITableView *tableView = (UITableView *)cell.superview.superview;
따라서 iOS 6까지 지원되는 iOS의 경우 솔루션은 다음과 같습니다.
UITableView *tableView = (UITableView *)cell.superview;
스위프트 5 확장
재귀적으로
extension UIView {
func parentView<T: UIView>(of type: T.Type) -> T? {
guard let view = superview else {
return nil
}
return (view as? T) ?? view.parentView(of: T.self)
}
}
extension UITableViewCell {
var tableView: UITableView? {
return parentView(of: UITableView.self)
}
}
루프 사용
extension UITableViewCell {
var tableView: UITableView? {
var view = superview
while let v = view, v.isKind(of: UITableView.self) == false {
view = v.superview
}
return view as? UITableView
}
}
은 iOS7이었습니다.UITableView
그것을 포함하고 있었습니다. (은 iOS7 GM입니다.UITableViewWrapperView
그것의 감독하에.UITableView
그 문제에 대한 두 가지 해결책이 있습니다.
#1 : 솔루션 #1: 솔루션UITableViewCell
@implementation UITableViewCell (RelatedTable)
- (UITableView *)relatedTable
{
if ([self.superview isKindOfClass:[UITableView class]])
return (UITableView *)self.superview;
else if ([self.superview.superview isKindOfClass:[UITableView class]])
return (UITableView *)self.superview.superview;
else
{
NSAssert(NO, @"UITableView shall always be found.");
return nil;
}
}
@end
이것은 사용하기에 좋은 대체품입니다.cell.superview
코드를 수 . 하고 " 기존코 쉽수할있다습니링리터팩게드를다있수니▁makes▁search습▁with▁and▁--▁just▁replace기▁code▁your존▁it"로 바꾸기만 하면 됩니다. 검색하고 대체하기만 하면 됩니다.[cell relatedTable]
나중에 보기 계층 구조가 변경되거나 복구될 경우 테스트에 즉시 표시되도록 어설션을 제출합니다.
하기 #2: 약점 추가하기UITableView
에 대한 UITableViewCell
@interface SOUITableViewCell
@property (weak, nonatomic) UITableView *tableView;
@end
기존 프로젝트에서 사용하려면 코드 리팩터링이 조금 더 필요하지만 훨씬 더 나은 설계입니다.의 신의에서.tableView:cellForRowAtIndexPath
셀셀가 SOUITableViewCell에서 합니다.SOUITableViewCell
셀의 tableView 속성에 tableView를 할당합니다. 셀 에서 셀내부에서다사포용표함여수있참다보습니조할기를을 사용하여 된 표 할 수 .self.tableView
.
표시된 경우에는 수퍼 뷰가 있습니다.그리고...놀랍게도...SuperView는 UITableView 개체입니다.
하지만, 수퍼 뷰를 갖는 것이 화면에 있다는 보장은 없습니다.그러나 UITableView는 표시되는 셀을 확인하는 방법을 제공합니다.
또한 셀에서 테이블로의 전용 참조는 없습니다.그러나 UITableViewCell을 하위 클래스로 분류할 때 이를 도입하여 생성 시 설정할 수 있습니다.(서브뷰 계층을 생각하기 전에 저 자신이 많이 했습니다.)
iOS7용 업데이트: Apple이 여기서 하위 보기 계층을 변경했습니다.일반적으로 상세하게 문서화되지 않은 작업을 수행할 때는 항상 상황이 변경될 위험이 있습니다.UITableView 개체를 찾을 때까지 보기 계층을 "크롤업"하는 것이 훨씬 더 안전합니다.
Swift 2.2 솔루션.
특정 유형의 보기를 재귀적으로 검색하는 UIView 확장입니다.
import UIKit
extension UIView {
func lookForSuperviewOfType<T: UIView>(type: T.Type) -> T? {
guard let view = self.superview as? T else {
return self.superview?.lookForSuperviewOfType(type)
}
return view
}
}
또는 더 컴팩트함(카비로베라이 덕분):
import UIKit
extension UIView {
func lookForSuperviewOfType<T: UIView>(type: T.Type) -> T? {
return superview as? T ?? superview?.superviewOfType(type)
}
}
당신의 감방에서 당신은 그냥 그것을 부릅니다:
let tableView = self.lookForSuperviewOfType(UITableView)
// Here we go
UITableViewCell은 cellForRowAt 다음에만 UITableView에 추가됩니다.인덱스 경로가 실행됩니다.
슈퍼 뷰에 전화를 걸거나 응답기 체인을 통해 할 수 있는 일은 매우 취약할 것입니다.이것을 하는 가장 좋은 방법은, 만약 세포가 무언가를 알고 싶어한다면, 세포가 묻고 싶은 질문에 답하는 어떤 방법에 응답하는 어떤 물체를 세포로 전달하고, 제어기가 무엇에 대답해야 할지 결정하는 논리를 구현하게 하는 것입니다(당신의 질문에서, 세포가 무엇이 보이는지 아닌지 알고 싶어하는 것 같습니다).
셀에 대리자 프로토콜을 만들고 셀의 대리자를 테이블ViewController로 설정하고 테이블ViewCotroller에서 모든 UI "제어" 로직을 이동합니다.
테이블 뷰 셀은 정보만 표시하는 덤 뷰여야 합니다.
상위 테이블을 가져오기 위해 UITableViewCell에 범주를 만들었습니다. 보기:
@implementation UITableViewCell (ParentTableView)
- (UITableView *)parentTableView {
UITableView *tableView = nil;
UIView *view = self;
while(view != nil) {
if([view isKindOfClass:[UITableView class]]) {
tableView = (UITableView *)view;
break;
}
view = [view superview];
}
return tableView;
}
@end
최고야.
위의 답변을 바탕으로 한 Swift 버전입니다.로 일반화했습니다.ExtendedCell
나중에 쓸 수 있도록
import Foundation
import UIKit
class ExtendedCell: UITableViewCell {
weak var _tableView: UITableView!
func rowIndex() -> Int {
if _tableView == nil {
_tableView = tableView()
}
return _tableView.indexPathForSelectedRow!.row
}
func tableView() -> UITableView! {
if _tableView != nil {
return _tableView
}
var view = self.superview
while view != nil && !(view?.isKindOfClass(UITableView))! {
view = view?.superview
}
self._tableView = view as! UITableView
return _tableView
}
}
이 도움을 바랍니다 :)
저는 이 해결책을 게이브의 제안에 기초했습니다.UITableViewWrapperView
객체는 의 감독입니다.UITableViewCell
iOS7 베타5의 개체입니다.
하위 클래스UITableviewCell
:
- (UITableView *)superTableView
{
return (UITableView *)[self findTableView:self];
}
- (UIView *)findTableView:(UIView *)view
{
if (view.superview && [view.superview isKindOfClass:[UITableView class]]) {
return view.superview;
}
return [self findTableView:view.superview];
}
위 답변에서 조금 빌리고 수정하여 다음과 같은 스니펫을 작성하였습니다.
- (id)recursivelyFindSuperViewWithClass:(Class)clazz fromView:(id)containedView {
id containingView = [containedView superview];
while (containingView && ![containingView isKindOfClass:[clazz class]]) {
containingView = [containingView superview];
}
return containingView;
}
클래스를 전달하면 다른 경우에도 UITableView 이외의 보기를 이동하고 볼 수 있는 유연성이 제공됩니다.
이 문제에 대한 제 솔루션은 다른 솔루션과 다소 유사하지만 우아한 for-loop을 사용하고 짧습니다.또한 미래에 대비해야 합니다.
- (UITableView *)tableView
{
UIView *view;
for (view = self.superview; ![view isKindOfClass:UITableView.class]; view = view.superview);
return (UITableView *)view;
}
UITableView *tv = (UITableView *) self.superview.superview;
BuyListController *vc = (BuyListController *) tv.dataSource;
["]을(를 사용해 보십시오.UItableViewvariable" visibleCells]입니다.
저는 그것을 앱이 본 세포들을 순환시키기 위해 각각의 루프에 사용했고 그것은 작동했습니다.
for (UITableView *v in [orderItemTableView visibleCells])//visibleCell is the fix.
{
@try{
[orderItemTableView reloadData];
if ([v isKindOfClass:[UIView class]]) {
ReviewOrderTableViewCell *cell = (ReviewOrderTableViewCell *)v;
if (([[cell deleteRecord] intValue] == 1) || ([[[cell editQuantityText] text] intValue] == 0))
//code here
}
}
}
매력적으로 작동합니다.
최소한으로 테스트되었지만 일반적이지 않은 Swift 3 예제는 작동하는 것 같습니다.
extension UITableViewCell {
func tableView() -> UITableView? {
var currentView: UIView = self
while let superView = currentView.superview {
if superView is UITableView {
return (superView as! UITableView)
}
currentView = superView
}
return nil
}
}
코드 이칙`UITableView *tblView=[cell superview];
셀 " " " " " " UI " " 를 를 제공합니다.
뷰 계층 구조를 이 방법으로 이동하여 상위 UITableView를 찾는 것이 좋습니다.
- (UITableView *) findParentTableView:(UITableViewCell *) cell
{
UIView *view = cell;
while ( view && ![view isKindOfClass:[UITableView class]] )
{
#ifdef DEBUG
NSLog( @"%@", [[view class ] description] );
#endif
view = [view superview];
}
return ( (UITableView *) view );
}
그렇지 않으면 Apple이 보기 계층을 다시 변경할 때 코드가 손상됩니다.
UITableViewCell Internal View Hierarchy Change in iOS 7
Using iOS 6.1 SDK
<UITableViewCell>
| <UITableViewCellContentView>
| | <UILabel>
Using iOS 7 SDK
<UITableViewCell>
| <UITableViewCellScrollView>
| | <UIButton>
| | | <UIImageView>
| | <UITableViewCellContentView>
| | | <UILabel>
The new private UITableViewCellScrollView class is a subclass of UIScrollView and is what allows this interaction:
![enter image description here][1]
[1]: http://i.stack.imgur.com/C2uJa.gif
http://www.curiousfind.com/blog/646 감사합니다.
코드 한 줄로 얻을 수 있습니다.
UITableView *tableView = (UITableView *)[[cell superview] superview];
extension UIView {
func parentTableView() -> UITableView? {
var viewOrNil: UIView? = self
while let view = viewOrNil {
if let tableView = view as? UITableView {
return tableView
}
viewOrNil = view.superview
}
return nil
}
}
@idris 답변에서 Swift의 UITableViewCell에 대한 확장을 작성했습니다.
extension UITableViewCell {
func relatedTableView() -> UITableView? {
var view = self.superview
while view != nil && !(view is UITableView) {
view = view?.superview
}
guard let tableView = view as? UITableView else { return nil }
return tableView
}
언급URL : https://stackoverflow.com/questions/15711645/how-to-get-uitableview-from-uitableviewcell
'it-source' 카테고리의 다른 글
변수를 사용하여 열 이름을 지정하는 방법 ggplot (0) | 2023.06.06 |
---|---|
Android 그리기 가능 디렉토리에 하위 디렉토리를 포함할 수 있습니까? (0) | 2023.06.06 |
Android에서 화면 크기를 픽셀로 가져오는 방법 (0) | 2023.06.06 |
Gem 파일에서 로컬 보석을 지정하려면 어떻게 해야 합니까? (0) | 2023.06.06 |
ASP.NET: HTTP 오류 500.19 – 내부 서버 오류 0x8007000d (0) | 2023.06.06 |