Video: Hướng dẫn khôi phục các ứng dụng hệ thống lỡ may bị xóa mất trên iPhone 2025
Bởi vì bạn có thể thay bộ điều khiển chế độ xem trong ứng dụng iOS của bạn bằng một ứng dụng mới - mặc dù một từ cùng một lớp cơ sở - trình điều khiển chế độ xem mới đã không có quyền truy cập vào các nút nó cần để hiển thị hoặc popover cần loại bỏ. May mắn thay, folks của Apple cung cấp một nơi hoàn hảo để làm điều đó.
Khi một tập tin được kích hoạt - bạn làm gì khi gõ mục nhập Bảng - nhưng trước khi trình điều khiển mới trình bày chế độ xem của nó, thời gian chạy tập lệnh sẽ gọi phương thức của trình điều khiển chế độ xem hiện tại để nó có thể truyền dữ liệu tới trình điều khiển chế độ xem đó về để được hiển thị.
Điều đó có nghĩa là bạn có thể truyền thông tin nút tới trình điều khiển chế độ xem mới ngay cả khi nó được khởi chạy. Sau đó, prepareForSegue: sender:, cả hai sẽ gán nút để được sử dụng trong viewDidLoad và loại bỏ bộ điều khiển chế độ xem.
prepareForSegue: sender: là một phương pháp điều khiển chế độ xem thông báo cho trình điều khiển chế độ xem rằng một tập tin sắp được thực hiện. segue là đối tượng UIStoryboadSegue, và nó chứa thông tin về bộ điều khiển chế độ xem có liên quan đến việc nối tiếp.
Bạn thêm đoạn code vào phương thức prepareForSegue: sender: để tạo cho DestinationController UisplitViewController delegate và gán các thuộc tính popOverButton và masterPopoverController.
Bạn cũng sẽ loại bỏ popover khi nó hiện diện để người dùng không phải chạm vào chế độ xem để thoát khỏi nó.
Để làm tất cả điều đó, thêm mã này vào MasterViewController. m.
- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender {nếu ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {DetailViewController * currentDetailViewController; ifControls lastObject isKindOfClass: [UINavigationController class])) currentDetailViewController = (DetailViewController *) ((UINavigationController *) [tự phân tách viewController ViewControllers lastObject]). topViewController; else currentDetailViewController = [tự.splitViewController. viewControllers lastObject]; nếu (currentDetailViewController masterPopover Controller! = nil) [currentDetailViewController. masterPopover Controller dismissPopoverAnimated: YES]; DetailViewController * destinationDetailViewController; nếu ([. topViewController; else destinationDetailViewController = segue. destinationViewController; tự. splitViewController. delegate = destinationDetailViewCon troller; destinationDetailViewController. popOverButton = currentDetailViewController. popOverButton; destinationDetailViewController. masterPopoverController = currentDetailViewController. masterPopoverController;}}
Bạn bắt đầu bằng việc tìm kiếm bộ điều khiển Detail View hiện tại vì nó có nút và tính năng popover mà trình điều khiển chế độ xem mới cần.
Mã này có vẻ phức tạp hơn nó. Trước tiên, bạn kiểm tra xem liệu bạn đang chạy trên iPad hay không. Nếu bạn đang có, bạn sẽ có được bộ điều khiển Xem chi tiết hiện tại bằng cách truy cập danh sách bộ điều khiển xem trong mảng viewController của splitViewController. May mắn thay, lớp UIViewController có một thuộc tính splitViewController để làm cho bạn dễ dàng.
Sau đó bạn kiểm tra xem bộ điều khiển Điều khiển có nằm trong mảng viewControllers hay không, nếu có thì bạn sẽ có được topViewController của điều khiển điều khiển (điều khiển chế độ xem hiện tại); nếu không, bạn chỉ cần sử dụng bộ điều khiển trong mảng. (Bạn sẽ nhận thấy rất nhiều sự đúc đang diễn ra ở đây)
if ([[viewControllers & # x2028; lastObject]
isKindOfClass: [UINavigationController & # x2028; class]])currentDetailViewController = (RTDetailViewController *)
(UINavigationController *)
[tự. splitViewController. viewControllers
lastObject]). topViewController; else
currentDetailViewController = & # x2028; [tự. splitViewController. viewControllers
lastObject];
Tiếp theo, nếu bạn thấy một popover, bạn muốn loại bỏ nó. Bạn kiểm tra để xem liệu một trình điều khiển popover (đó là lý do tại sao bạn phải làm cho thuộc tính có thể truy cập được bằng cách di chuyển nó vào tệp tiêu đề.)
if (currentDetailViewController. MasterPopoverController
! = Nil)[currentDetailViewController. MasterPopoverController > deletePopoverAnimated: YES];
Tiếp theo, bạn tìm thấy bộ điều khiển đích mới (cái được chuyển sang) sử dụng logic tương tự như logic mà bạn đã sử dụng để tìm bộ điều khiển Detail View hiện tại
if ([segue. destinationViewController < & # x2028; isKindOfClass: [UINavigationController
lớp]]) destinationDetailViewController =
(DetailViewController *) ((UINavigationController *)segue destinationViewController) topViewController; khác
destinationDetailViewController =
.. Sau đó, bạn chỉ cần thiết lập delegate Viewer Controller cho bộ điều khiển view mới, vì vậy nó sẽ nhận được splitViewController: willHideViewController: withBarButtonItem: forPopoverController: a d splitViewController: willShowViewController: invalidatingBarButtonItem: tin nhắn.
tự. splitViewController. delegate = destinationDetailViewController;
Cuối cùng, bạn gán các thuộc tính popOverButton và masterPopOverController trong bộ điều khiển chế độ xem mới.
destinationDetailViewController. popOverButton =
currentDetailViewController. popOverButton;
destinationDetailViewController. masterPopoverController =
currentDetailViewController. masterPopoverController;
Phải thừa nhận, điều này chỉ loại bỏ popover và gán các thuộc tính, nhưng không làm bất cứ điều gì để hiển thị nút. Điều đó thực sự được thực hiện trong viewDidLoad.Bạn cũng có thể chỉ định kích thước của cửa sổ bật lên bằng cách gán một giá trị cho thuộc tính prefferedContentSize. Bạn nên lưu ý rằng kích thước thực tế có thể được giảm xuống để bật lên phù hợp trên màn hình và popover không chồng chéo một bàn phím khi bàn phím được trình bày. Bạn có thể thấy mã mà thực hiện điều đó trong phương thức awakeFromNib của MasterViewController.
- (void) awakeFromNib {if ([[UIDevice currentDevice]
userInterfaceIdiom == UIUserInterfaceIdiomPad)
& # x2028; {bản thân. xóaSelectionOnViewWillAppear = KHÔNG;
tự. Các tin nhắn awakeFromNib được gửi đến một đối tượng đã được instantiated từ storyboard sau khi tất cả các đối tượng đã được nạp và khởi tạo.. Khi tin nhắn được gửi đi, tất cả kết nối ra và kết nối hành động đã được thiết lập.
Nếu bạn quyết định bỏ qua lời khuyên ở đây và không loại bỏ trình điều khiển bật lên, nhấn bên ngoài cửa sổ bật lên sẽ làm cho popover bị loại. Tuy nhiên, bạn có thể cho phép người dùng tương tác với các chế độ xem được chỉ định và không loại bỏ popover bằng cách sử dụng thuộc tính passthroughViews (mặc dù bạn sẽ không làm điều đó ở đây). Sau đó, bạn phải tự mình loại bỏ bản thân.
