2014-04-04 2 views
2

두 클래스가 있습니다. 하나는 ItemController (확장 UITableViewController)이고 다른 하나는 ItemCell (확장 'UITableViewCell')입니다.UITableViewCell에서 새 컨트롤러를 푸는 방법

각 셀을 클릭하면 ItemControllerdidSelectRowAtIndexPath에서 새 컨트롤러를 푸시합니다.

또한 ItemCell에는 각 셀마다 다른 tag의 작은 버튼 몇 개가 있습니다. 이 버튼 중 하나를 클릭하면 새 컨트롤러를 푸시하고 싶습니다. 어떻게해야합니까? 이 navigationController

이 없기 때문에 ItemCell에서

self.navigationController.pushViewController 잘 너무 :

편집

이잖아, 내가 RubyMotion에서가 아닌 경우 솔루션을 참조하는 것을 선호 작동하지 않습니다

나는 delegate이 해결책 일 수 있다는 것을 읽었지만 그것을 구현하는 방법을 모르겠습니다.

def tableView(table_view, cellForRowAtIndexPath: index_path) 
    data_row = self.data[index_path.row] 
    cell = table_view.dequeueReusableCellWithIdentifier(CATEGORY_CELL_ID) || begin 
     rmq.create(ItemCell.initWithSomething(self), :category_cell, reuse_identifier: CATEGORY_CELL_ID).get 
    end 
    cell.update(data_row) 
    cell 
    end 

ItemCell : 이것은 내가

ItemController의

한 일이다

class ItemCell < UITableViewCell 

    attr_accessor :delegate 
    def initWithSomething(delegate) 
    @delegate = delegate 
    end 

    ...use @delegate to push the new controller 
end 

을하지만 오류를 얻을

item_controller.rb : 114 : tableView:cellForRowAtIndexPath:': undefined method initWithSomething에 ' ItemCell의 경우 : 클래스 (NoMethodError)

+0

물어보기 전에 뭔가를 시도해 보셨습니까? – javierfdezg

+0

탐색 컨트롤러없이 새보기 컨트롤러를 "밀어 넣을"수 없습니다.presentViewController : animated : completion : – rdelmar

+0

@ oski555 내가 시도한 방식으로 질문을 업데이트했습니다. – Anthony

답변

1

일반적인 생각은 셀이 당신의 View Controller에게 다른 View Controller를 푸시하기로 결정한 View Controller보다 반드시 일어 났음을 말해야한다는 것입니다.

당신은 위임 디자인 패턴과 그 작업을 수행 할 수 있습니다

ItemCell이 프로토콜을 준수 delegate 속성이 있습니다. 휴대의 버튼 상에 IBAction를 트리거합니다

cell.delegate = self 

: tableView:cellForRowAtIndexPath:에서 예를

@class ItemCell 
@protocol ItemCellDelegate 
- (void)itemCellDidClickSubmitButton:(ItemCell *)cell; 
@end 

@interface ItemCell 
@property (nonatomic, weak) id<ItemCellDelegate> delegate 
... 
@end 

위해 당신은 셀 대표와 컨트롤러 (분명히 뷰 컨트롤러가 ItemCellDelegate을 준수한다)을 설정합니다 셀 자체는 대리자 메서드를 호출합니다.

- (IBAction)submitButtonTapped:(id)sender 
{ 
    id <ItemCellDelegate> delegate = self.delegate; 
    if ([delegate respondToSelector:@selector(itemCellDidClickSubmitButton:)]) { 
     [delegate itemCellDidClickSubmitButton:self]; 
    } 
} 

분명히 View Controller에서 다음과 같은 작업을 수행해야합니다. :

#pragma mark - ItemCellDelegate 

- (void)itemCellDidClickSubmitButton:(ItemCell)cell 
{ 
    UIViewController *controller = // Create the view controller to push 
    [self.navigationController pushViewController:controller]; 
} 
+0

위대한 작품입니다. 저는 위임을 올바르게하지 않았습니다. – Anthony

관련 문제