Trong ShareKit, mã cần xác định nơi rootViewController là để nó có thể hiển thị một chế độ xem phương thức. Vì một số lý do, mã không thành công trong iOS 5:Tìm rootViewController trong iOS
// Try to find the root view controller programmically
// Find the top window (that is not an alert view or other window)
UIWindow *topWindow = [[UIApplication sharedApplication] keyWindow];
if (topWindow.windowLevel != UIWindowLevelNormal)
{
NSArray *windows = [[UIApplication sharedApplication] windows];
for(topWindow in windows)
{
if (topWindow.windowLevel == UIWindowLevelNormal)
break;
}
}
UIView *rootView = [[topWindow subviews] objectAtIndex:0];
id nextResponder = [rootView nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]])
self.rootViewController = nextResponder;
else
NSAssert(NO, @"ShareKit: Could not find a root view controller. You can assign one manually by calling [[SHK currentHelper] setRootViewController:YOURROOTVIEWCONTROLLER].");
Đây là sự khẳng định.
Điều gì sai khi chỉ sử dụng mã sau đây?
rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
Điều này có vẻ hoạt động tốt. Nó sẽ thất bại trong một số điều kiện?
Cảm ơn. Các rootViewController được thiết lập, trong trường hợp này. Nó không rõ ràng với tôi rằng chỉ cần thiết lập rằng tự động làm cho nó rootViewController cho mục đích của mã ShareKit này. Đây là một ứng dụng toàn cầu, và trong mã iPhone, rootViewController là một UITabBarController được phân lớp. Tôi nên thêm rằng tôi cũng có một UIAlertView và UIView được thêm dưới dạng subviews vào cửa sổ ứng dụng. (Tôi có thể hiển thị một hoặc cả hai người trong số họ bất kể xem từ tabbarcontroller được hiển thị.) Mã của bạn trả về UIAlertView là objectAtIndex: 0. Tôi chỉ có thể lặp lại thông qua phần còn lại, tôi đoán vậy. – Jim
nếu bạn đang đặt nó trong ứng dụng của mình thì chắc chắn nó sẽ hoạt động. Tôi không biết nếu bạn đang tạo một thư viện cho người khác sử dụng nơi bạn không thể dựa vào 'window.rootViewController' đang được thiết lập. – XJones
@XJones, nếu window.rootViewController không được đặt? có cách nào khác đáng tin cậy để có được bộ điều khiển xem hiện tại không? – Zennichimaro