Swift điều hướng theo chương trình đến một bộ điều khiển / cảnh xem khác


81

Tôi đang sử dụng mã sau để điều hướng theo chương trình đến một ViewController khác. Nó hoạt động tốt, nhưng nó một số làm thế nào ẩn navigation bar. Làm cách nào để sửa lỗi này? (thanh điều hướng được tạo bằng cách nhúng ViewControllervào navigation controllernếu điều đó quan trọng.)

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)

Câu trả lời:


200

Swift 5

Kiểu trình bày phương thức mặc định là một thẻ. Điều này hiển thị bộ điều khiển chế độ xem trước đó ở trên cùng và cho phép người dùng vuốt bộ điều khiển chế độ xem được trình bày.

Để giữ lại kiểu cũ, bạn cần sửa đổi bộ điều khiển chế độ xem mà bạn sẽ trình bày như sau:

newViewController.modalPresentationStyle = .fullScreen

Điều này giống nhau đối với cả bộ điều khiển được tạo lập trình và bộ điều khiển được tạo trong bảng phân cảnh.

Swift 3

Với Bộ điều khiển được tạo lập trình

Nếu bạn muốn điều hướng đến Bộ điều khiển được tạo theo chương trình, hãy làm như sau:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

Với một Bộ điều khiển được tạo StoryBoard

Nếu bạn muốn điều hướng đến Bộ điều khiển trên StoryBoard với Mã định danh "newViewController", hãy làm như sau:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)

2
"! như NewViewController" là không cần thiết trong lựa chọn kịch bản
Lavi Avigdor

2
yeh tôi biết rằng là không bắt buộc, nhưng nếu chúng tôi hiển thị sau đó nó trở nên rõ ràng mà viewController là điểm đến cho nhà phát triển khác
Jaiswal Rajan

4
Gọi storyBoard.instantiateViewControllerself.presenttừ các chủ đề chính, hoặc bạn sẽ có một sự chậm trễ trong xuất hiện các thành phần viewController
Alex

2
@Alex nhìn này, tùy nhà phát triển gọi nó từ main thread, tôi vừa viết câu trả lời cho câu hỏi được hỏi ở trên. Nhận xét của bạn để gọi từ main thread là không phù hợp ở đây.
jaiswal Rajan

Hi peeps: theo nguyên tắc chung, tôi có thể đề xuất một giọng điệu thân thiện hơn không? (Đây là một vấn đề ở đây trên SO) Thay vào đó, với chủ đề: mặc dù nó không được OP hỏi trực tiếp, tôi nghĩ câu trả lời hay này vẫn là một nơi thích hợp để ghi nhớ (đối với bất kỳ ai đang đọc) rằng hành động phải xảy ra trên chủ đề chính
superjos

32

SWIFT 4.x

Các chuỗi trong dấu ngoặc kép luôn làm tôi bối rối, vì vậy tôi nghĩ câu trả lời cho câu hỏi này cần một số bản trình bày đồ họa để làm rõ điều này.

Đối với một ứng dụng ngân hàng, tôi có một LoginViewController và một BalanceViewController. Mỗi loại có màn hình tương ứng.

Ứng dụng khởi động và hiển thị màn hình Đăng nhập. Khi đăng nhập thành công, ứng dụng sẽ mở màn hình Số dư.

Đây là cách nó trông:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Việc đăng nhập thành công được xử lý như sau:

let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil)
let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController
self.present(balanceViewController, animated: true, completion: nil)

Như bạn có thể thấy, 'số dư' ID bảng phân cảnh bằng chữ cái nhỏ là những gì nằm trong dòng thứ hai của mã và đây là ID được xác định trong cài đặt bảng phân cảnh, như trong ảnh chụp màn hình đính kèm.

Thuật ngữ 'Số dư' với chữ 'B' viết hoa là tên của tệp bảng phân cảnh , được sử dụng trong dòng đầu tiên của mã.

Chúng tôi biết rằng việc sử dụng các Chuỗi được mã hóa cứng trong mã là một thực tế rất tệ, nhưng bằng cách nào đó trong quá trình phát triển iOS, nó đã trở thành một thông lệ phổ biến và Xcode thậm chí không cảnh báo về chúng.


các cuộc biểu tình tuyệt vời
Elias Fazel

1
Bạn thật tuyệt vời!
OhhhThatVarun

15

Bạn nên đẩy bộ điều khiển chế độ xem mới bằng cách sử dụng bộ điều khiển điều hướng hiện tại, không hiện tại.

self.navigationController.pushViewController(nextViewController, animated: true)

tại sao chúng ta nên thúc đẩy là có bất kỳ lợi ích?
DragonFire

1
@DragonFire, vì op muốn nó hoạt động mà không che thanh điều hướng. nếu bạn muốn có thiết kế trang chi tiết chính như giữa màn hình danh bạ whatsapp và màn hình trò chuyện, bạn phải pushcó bộ điều khiển chế độ xem với bộ điều khiển điều hướng của mình. (sẽ hoạt ảnh từ trái sang phải) nếu bạn chỉ muốn hiển thị, trình bày, cửa sổ bật lên trên màn hình hiện tại (sẽ hoạt ảnh từ dưới lên trên), chỉ cần sử dụng present.
Okan Kocyigit

12

Theo @jaiswal Rajan trong câu trả lời của mình . Bạn có thể thực hiện một pushViewController như sau:

let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
self.navigationController?.pushViewController(newViewController, animated: true)

1
Xin chào, bạn chỉ tự hỏi: tại sao phải lặp lại câu trả lời đã đăng? Có lẽ một bình luận hoặc một ủng hộ cũng sẽ ổn. Hoặc có những lý do khác đằng sau?
superjos

Anh ấy đang trình bày để điều hướng với NavigationController. Cảm ơn bạn.
Hiran DA Walawage

4

Vì vậy, nếu bạn trình bày một bộ điều khiển chế độ xem, nó sẽ không hiển thị trong bộ điều khiển điều hướng. Nó sẽ chỉ có màn hình hoàn chỉnh. Đối với trường hợp này, bạn phải tạo một bộ điều khiển điều hướng khác và thêm nextViewControllerlàm root của bạn cho điều này và trình bày điều hướng mới này.

Một cách khác là chỉ cần đẩy bộ điều khiển chế độ xem.

self.presentViewController(nextViewController, animated:true, completion:nil)

Để biết thêm thông tin, hãy kiểm tra tài liệu của Apple: - https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/doc/uid/TP40006926-CH3-SW96


presentViewControllerđã được đổi tên thành present(loginController, animated:true, completion:nil)
kite_n_code

2
OperationQueue.main.addOperation {
   let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
   let newViewController = storyBoard.instantiateViewController(withIdentifier: "Storyboard ID") as! NewViewController
   self.present(newViewController, animated: true, completion: nil)
}

Nó hoạt động với tôi khi tôi đặt mã bên trong, mã OperationQueue.main.addOperationđó sẽ thực thi trong luồng chính cho tôi.


1

Đoạn mã trên hoạt động tốt nhưng nếu bạn muốn điều hướng từ một NSObjectlớp, nơi bạn không thể sử dụng self.present:

let storyBoard = UIStoryboard(name:"Main", bundle: nil)
if let conVC = storyBoard.instantiateViewController(withIdentifier: "SoundViewController") as? SoundViewController,
    let navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController {
    
    navController.pushViewController(conVC, animated: true)
}

0

Tất cả các câu trả lời khác đều có vẻ tốt, tôi muốn đề cập đến trường hợp của mình, trong đó tôi phải tạo LaunchScreen hoạt hình, sau đó sau 3 đến 4 giây hoạt ảnh, nhiệm vụ tiếp theo là chuyển đến Màn hình chính. Tôi đã thử segues, nhưng điều đó đã tạo ra vấn đề cho chế độ xem đích. Vì vậy, cuối cùng tôi đã truy cập thuộc tính Cửa sổ của AppDelegates và tôi đã gán một màn hình NavigationController mới cho nó,

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController

//Below's navigationController is useful if u want NavigationController in the destination View
let navigationController = UINavigationController(rootViewController: homeVC)
appDelegate.window!.rootViewController = navigationController

Nếu trong trường hợp đó, bạn không muốn điều hướngController trong dạng xem đích thì chỉ cần gán là,

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController
appDelegate.window!.rootViewController = homeVC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.