2017-05-04 14 views
0

스토리 보드에서 2 개의 tabBar 항목을 추가하고 UITabBarItem - 메뉴에서 프로그래밍 방식으로을 추가했습니다. 스토리 보드를 사용하여 만든 tabBarItems에 해당하는 컨트롤러를 성공적으로 열 수 있습니다. 그러나, 나는 "메뉴"를 클릭하면 빈 검은 화면이 프로그래밍 방식으로 UITabBar에 컨트롤러를 추가 할 수 없습니다.

@objc public class MainScreenTabsController : UITabBarController { 
public override func viewDidLoad() { 
    super.viewDidLoad() 
    let tabController = MyViewController() 
    let tabBarItem = UITabBarItem(title: "Menu", image: UIImage(named: "more-options.png"), selectedImage: UIImage(named: "more-options")) 
    tabController.tabBarItem = tabBarItem 
    var array = self.viewControllers 
    array?.append(tabController) 
    self.viewControllers = array 
} 

public func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { 
    return true; 
} 

public override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
} 
} 

내가 탭 표시 줄의 항목을 추가하기위한 튜토리얼의 커플을 따라하지만, 그들 모두는 내가 쓴 코드를 가지고 나타납니다. 나는 아주 기본적인 것을 놓치고 있습니까? The three dots represent menu. The word menu is not included because in the real code I gave a blank string

편집 : 앱은 당신의 코드가 뭘 말하고있다 정확히하고있다

@objc public class MyViewController:UIViewController { 

public override func viewDidLoad() { 
    super.viewDidLoad() 
} 

public override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
} 
} 
+0

는 (메뉴) 컨트롤러 코드를 화면에 다시 찾고에 대한 –

+0

감사를 표시 코드 아래에 주어진 같은 뷰 컨트롤러의 인스턴스를 스토리 보드를 사용하는 경우. –

+0

MyViewController()가 InstantiatedViewController를 줄 것이라고 생각하지 않습니다. –

답변

1

메뉴 컨트롤러에 대한

클래스입니다. MyViewController의 인스턴스를 만들고이를 UITabBarController의 뷰 컨트롤러 배열에 추가하고 있습니다.

MyViewController 클래스 파일은 단순히 빈 검은 색보기를 정의합니다.

스토리 보드에 MyViewController으로 사용하려는 ViewController를 만들었습니까? 그렇다면 스토리 보드에서 인스턴스화해야합니다. 당신이 당신의 스토리 보드를 편집 할 때

사용하려는 VC에 MyViewController 클래스를 할당하고, 는 그것을 Storyboard ID 제공 - 같은 MyVC으로합니다. 그런 다음이에 viewDidLoad 기능을 편집

public override func viewDidLoad() { 
    super.viewDidLoad() 

    // wrong way 
    // let tabController = MyViewController() 

    if let tabController = storyboard?.instantiateViewController(withIdentifier: "MyVC") as? MyViewController { 

     let tabBarItem = UITabBarItem(title: "Menu", image: UIImage(named: "more-options.png"), selectedImage: UIImage(named: "more-options")) 
     tabController.tabBarItem = tabBarItem 
     var array = self.viewControllers 
     array?.append(tabController) 
     self.viewControllers = array 

    } 

} 
+0

예, 스토리 보드에 컨트롤러를 만듭니다. 왜 tabBarItem과 다른 선언문을 괄호 안에 작성 했습니까? 내가 할 때, 나는 오류를 얻는다.자, sb = UIStoryboard (이름 : "유틸리티"번들 : 없음) 하자 인스턴스화 오전 tabController = sb.instantiateViewController (withIdentifier : "MyViewController")? MyViewController와 다른 코드 라인은 이것을 따른다. 그러나 화면은 여전히 ​​비어 있습니다. –

+0

"대괄호 안의"코드는'if let' 구조체 안에 있으며 강제 unwrapping과 nil 옵션을 피하는 데 도움이됩니다. 'let sb = UIStoryboard (name : "유틸리티", 번들 : nil) 줄에 중단 점을 놓고 단계별로 만들고있는 변수/객체의 값을 확인하십시오. 무언가가 실패하고 있는지보십시오. – DonMag

+0

도움과 설명에 감사드립니다. 솔루션이 작동했습니다! –

0

당신이 프로그래밍 방식 즉의 ViewController를 만드는입니다. nib/storyboard가 없으면 UIView 객체를 인스턴스화하고 뷰 컨트롤러의 view 속성을 설정해야합니다. 이를 수행하려면 loadView 메소드를 구현하고 viewController의 특성을보기 위해 뷰 오브젝트를 지정하십시오. 그런 다음 뷰 객체에 사용자 정의 뷰를 추가하고 아래 코드를 확인하십시오.

class MyViewController: UIViewController { 

    override func loadView() { 
     // super.loadView() // DO NOT CALL SUPER 

     //create view 
     view = UIView() 
     view.backgroundColor = UIColor.white 

     //Add a custom view with red color 
     let customView = UIView() 
     customView.translatesAutoresizingMaskIntoConstraints = false 
     customView.backgroundColor = UIColor.red 
     view.addSubview(customView) 

     NSLayoutConstraint.activate(
      [customView.leadingAnchor.constraint(equalTo: view.leadingAnchor), 
      customView.trailingAnchor.constraint(equalTo: view.trailingAnchor), 
      customView.topAnchor.constraint(equalTo: view.topAnchor), 
      customView.bottomAnchor.constraint(equalTo: view.bottomAnchor)] 
     ) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 
} 

쉽게 인터페이스 빌더에서 자동 레이아웃을 사용하기보다는 프로그래밍을하고 사용자 정의보기/컨트롤을 구성 할 수 있습니다 그것은이 목적을 위해 스토리 보드/펜촉을 사용하는 것이 좋은 것입니다. :)

편집 :

your'e 다음

class MainScreenTabsController: UITabBarController, UITabBarControllerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
     let tabController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainViewController") as! MainViewController //if using storyboard 
     let icon = UITabBarItem(title: "Menu", UIImage(named: "more-options.png"), selectedImage: UIImage(named: "more-options"))) 
     tabController.tabBarItem = icon 
     var controllers = self.viewControllers 
     controllers?.append(tabController) 
     self.setViewControllers(controllers!, animated: true) 
    } 
} 
+0

스토리 보드를 사용하여 UIViewController를 만들었습니다. 그런 다음 내 수업에 연결하십시오 –

+0

스토리 보드없이 코드를 사용해 보셨습니까? storyboard를 사용한다면 tabController = UIStoryboard (name : "Main", 번들 : nil) .instantiateViewController (withIdentifier : "MainViewController") 같은 코드를 사용하여 뷰 컨트롤러를 인스턴스화해야합니다. MainViewController – suhit