2016-06-19 4 views
9

Swift 2.3 및 Xcode 8 Beta 1을 사용하여 iOS10으로 앱을 업데이트하는 중입니다. UITableViewHeaderFooterContentView이 UIButton에 대한 터치를 차단합니다. 서브 클래스는 UITableViewHeaderFooterView입니다.iOS10 - UITableView Header에서 UIButton의 ContentView 차단 터치

Xcode 8 Beta 1 시뮬레이터에서 UIButton은 iOS9.3에서는 작동하지만 iOS10에서는 작동하지 않습니다.

1) 이에 대한 문서가 있습니까?

2) UI 요소가 iOS10의 새로운 콘텐츠보기 위에 있는지 어떻게 확인할 수 있습니까? (또는 UITableHeaderFooterContentView을 통한 터치 허용)

고마워!

Debug View Hierarchy of iOS9.3 and iOS10

TableHeader.xib

표 머리글

import UIKit 

class TableHeader: UITableViewHeaderFooterView { 

    @IBOutlet weak var dayLabel: UILabel! 

    @IBOutlet weak var dateLabel: UILabel! 

    @IBOutlet weak var addNewEventButton: UIButton! 

} 

코드 뷰에서 컨트롤러 dateCell.addNewEventButton 더 이상

,536 iOS10에 접촉을 수신하고있는 UIButton입니다
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 


    let tintColor = TintManager().getTintColour() 

    let dateCell:TableHeader = tableView.dequeueReusableHeaderFooterViewWithIdentifier("TableHeader") as! TableHeader 

    //dateCell.bringSubviewToFront(dateCell.addNewEventButton) 

    dateCell.dayLabel.text = Dates.day.uppercaseString 

    dateCell.dateLabel.text = Dates.date 

     dateCell.backgroundView = UIView(frame: dateCell.frame) 
     dateCell.backgroundView!.backgroundColor = tintColor 
     dateCell.dayLabel.textColor = UIColor.whiteColor() 
     dateCell.dateLabel.textColor = UIColor.whiteColor() 
     dateCell.addNewEventButton.backgroundColor = tintColor 



    dateCell.addNewEventButton.tag = section 
    dateCell.addNewEventButton.layer.cornerRadius = 20.0 

    if (savedEventView.superview === self.view) { 
     dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents) 
     dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddButtonToInsertSavedEvent(_:)), forControlEvents:.TouchUpInside) 
    } else { 
     dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents) 
     dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddNewEventOnTableViewHeader(_:)), forControlEvents:.TouchUpInside) 
    } 

    return dateCell 
} 
+0

은 엑스 코드에서 소개 3.0 빠른 생각 .I 마이그레이션 문서를 이동하십시오 8 베타 1 – Tuple

+0

그것은 스위프트 2.3은 여전히 ​​엑스 코드 호환 8 베타 1 –

+0

예, 물론 이해가 – Tuple

답변

4

위보기는 실제로 UITableViewHeaderFooterViewcontentView입니다 (Apple Docs 참조). 따라서 터치를 방해하지 않으려면 sendSubview(toBack:)을 사용할 수 있어야합니다.

그러나 iOS9에서는 UITableViewHeaderFooterView이보기가 NIB에서로드 된 경우 contentView을 올바르게 초기화하지 못하는 것으로 보입니다. contentView 속성은 선택 사항이 아니지만 실제로는 nil이며 액세스하려고하면 잘못된 액세스 오류가 발생합니다. 또한 읽기 전용 속성 (*)이므로 contentView (코드 또는 IB의 출력) 값을 설정할 수 없습니다. 따라서 내가 생각할 수있는 유일한 해결책은 #available을 사용하여 iOS 10 이상에서 실행중인 경우 contentView를 뒤로 이동시키는 코드를 조건부로 포함시키는 것입니다. 나는 당신의 서브 클래스에 관련 코드를 삽입합니다 :

override func awakeFromNib() { 
    if #available(iOS 10, *) { 
     self.sendSubview(toBack: contentView) 
    } 
} 

(*) 야생 추측을 선사, 내 생각 엔 애플이 UITableViewCell에 무겁게 UITableViewHeaderFooterView 코드를 기반으로한다는 것입니다. IB가 객체 라이브러리에 UITableViewCells을 가지고 있기 때문에 (셀에 contentView이 포함되어 있음을 알 수 있음) 셀의 contentView가 올바르게 인스턴스화되었는지 확인할 수 있습니다. 그러나 객체 라이브러리에는 UITableViewHeaderFooterView이 없으므로 contentView을 올바르게로드 할 수있는 방법이 없습니다. 그들은 contentView 빈을 인스턴스화하여 iOS10에서 수정 한 것 같습니다. 안타깝게도 그들은 UITableViewHeaderFooterView을 라이브러리에 추가하지 않았습니다.

+0

맞아 내가 사용에 아무 문제가 없다고 나의 이해의 당신의 iOS9로 코드를 작성하십시오. 같은 : - (UIView *) tableView : (UITableView *) tableView viewForHeaderInSection : (NSInteger) headerIndex { ... NSArray * nib = [[NSBundle mainBundle] loadNibNamed ... ... [headerView sendSubviewToBack : [headerView contentView]]; ... } – Darko

+0

@Darko Interesting. 내가 펜촉을 등록하고 대기열에서 빼낸 경우 문제가 발생했다. 펜촉을 직접 넣지 않았습니다. 하지만 그들은 모두 불쾌한'init (coder :)'이니셜 라이저를 사용해야하므로 좀 더 조사해야 할 것입니다. 또는 Objective-C가 무한 값에보다 관대 함을 나타낼 수 있습니다. – pbasdf

+0

가능합니다. 나는 iOS 9로 테스트를 해봤지만 작동하지만 안전면에 있기 위해 iOS 버전을 사용하기 전에 점검하고있다. – Darko

관련 문제