2017-02-02 2 views
1

저는 storyboards와 tableview를 사용하고 있습니다. 내 tableview의 각 셀에는 UIView이 있습니다. 이 UIViewIBOutlet을 프로그래밍 방식으로 바꿀 수 있습니까? 예를 들면 다음과 같이하면 :코드에서 IBOutlet보기를 바꿉니다.

class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var videoPlayerView: UIView! /// Really this is a VIMVideoPLayerView (from library below) which inherits from UIView. 

    func configureCell(with customObject: CustomObject) { 

     // Set the IBOutlet in code here. 
     self.videoPlayerView = customObject.videoPlayerView 
    } 
} 

이렇게하면 아무 일도 일어나지 않습니다.

저는 많은 사람들이 "왜 이걸하고 싶니?"라고 물을 것이다. 여기까지 : 나는이 라이브러리 VIMVideoPlayer을 사용하고 있으며 코드에 UIView가 포함 된 실제 플레이어를 만들었습니다. 플레이어를 재사용하는 대신 코드에서 한 번에 모두 만들었고 이제는이를 표시하려고합니다. 메인 스레드에서 스크롤링 및 지연을 막는 성능상의 이유가 있습니다.

참고 : 코드에서 이미 작동하지만 스토리 보드를 사용하고 싶습니다. 코드에서 작업하는 방식은 다음과 같습니다. videoHolderView.addSubview(customObject.videoPlayerView)

어떤 생각이 들었습니까?

+0

요약하면, 하위 비디오를 재생하는 비디오를 추가하려고합니다. 직접 추가 할 수 있지만 코드에 제약 조건을 추가해야합니다. 또는 IB에 제약 조건이 설정된 뷰의 하위 뷰로이를 추가 할 수 있습니다. 다른 선택 사항은 없습니다. 내가 아는 무엇이 subview 옵션에 문제가 무엇입니까? 질문은 "스크롤 및 지연"입니다. 왜 거기에 문제가 있고, 콘센트 UIView를 버리면 그 문제가 사라질까요? – danh

답변

1

에 필요한 모든 제약 조건을 추가 할 수 있습니다,하지만 그 뷰 계층 구조를 변경하지 않습니다

func configureCell(with customObject: CustomObject) { 

    // Set the IBOutlet in code here. 

    self.videoPlayerView.removeFromSuperview() 

    self.videoPlayerView = customObject.videoPlayerView 

    self.addSubView(self.videoPlayerView) 

} 

참고. 원본보기의 수퍼 뷰에 새보기를 삽입 한 다음 이전보기를 제거해야합니다. 레이아웃 제약 조건을 유지하지 않으므로 대체보기를 추가 한 후에 레이아웃 제약 조건을 다시 만들어야합니다.

class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var videoPlayerView: UIView! /// Really this is a VIMVideoPLayerView (from library below) which inherits from UIView. 

    func configureCell(with customObject: CustomObject) { 
     // Replace the view by inserting a new view into the same location 
     // in the view hierarchy 
     let newVideoPlayerView = customObject.videoPlayerView 
     videoPlayerView.superview.insertSubview(newVideoPlayerView, belowSubview: videoPlayerView) 
     videoPlayerView.removeFromSuperview() 

     // Set the IBOutlet in code here. 
     videoPlayerView = newVideoPlayerView 

     // TODO: Recreate your layout constraints 
    } 
} 
+0

아래의 답변에서 내 의견을 복사/붙여 넣고 있습니다. 제약 조건을 제거한 다음 다시 추가하지 않고도이 작업을 수행 할 수있는 방법이 있습니까? 스토리 보드의 이점은 필자가 시차를 갖고 있기 때문에 일부 제약 조건에 따라 달라 지므로 여기서는 스토리 보드로 전환하는 것이별로 도움이되지 않을 것입니다. – JEL

+0

아니요.하지만 다른 뷰를 래퍼로 사용하여 제약 조건을 단순화 할 수 있습니다.이 뷰에는 대체하려는 단일 하위 뷰만 포함되어 있습니다. 그런 다음 상위 뷰에 상위/왼쪽/아래/오른쪽 제약 조건을 추가 할 수 있습니다. – kevin

+0

나는 이것을 보면서 어떤 이점도 실제로 볼 수 없다. 이 스토리 보드 방식으로 어떤 이점이 있다고 생각하십니까? 다시 말하자면, 현재 내가하고있는 일은 코드에서 뷰를 생성 한 후'videoHolderView.addSubview (customObject.videoPlayerView) '를 수행하는 것입니다. – JEL

0

이 작업을 수행 할 수 있지만 모든 현재 코드가 수행중인 것은 속성을 업데이트하는 것입니다. 뷰 계층 구조에서 기존 뷰를 제거하고 새 뷰를 하위 뷰로 추가해야합니다. 당신은 또한 새로운 뷰 변수가 괜찮 수정

+0

제약 조건을 제거한 다음 다시 추가하지 않고도이 작업을 수행 할 수 있습니까? 스토리 보드의 이점은 필자가 시차를 갖고 있기 때문에 일부 제약 조건에 따라 달라 지므로 여기서는 스토리 보드로 전환하는 것이별로 도움이되지 않을 것입니다. – JEL