আপডেট: আমি ভুল ছিল। আপনি অবশ্যই UIApplication.shared.sendAction(_:to:from:for:)এই লিঙ্কটিতে প্রদর্শিত প্রথম প্রতিক্রিয়াকারীকে কল করতে ব্যবহার করতে পারেন : http://stackoverflow.com/a/14135456/746890 ।
এখানকার বেশিরভাগ উত্তর সত্যিকারের বর্তমান প্রতিক্রিয়াশীলটিকে সন্ধান করতে পারে না যদি তা ভিউ হায়ারার্কিতে না থাকে। উদাহরণস্বরূপ, AppDelegateবা UIViewControllerসাবক্ল্যাস।
এটির জন্য আপনাকে গ্যারান্টি দেওয়ার একটি উপায় আছে এমনকি যদি প্রথম প্রতিক্রিয়াকারী অবজেক্টটি একটি না হয় UIView।
প্রথমে এর বিপরীত সংস্করণটি প্রয়োগ করে এর nextবৈশিষ্ট্যগুলি ব্যবহার করে UIResponder:
extension UIResponder {
var nextFirstResponder: UIResponder? {
return isFirstResponder ? self : next?.nextFirstResponder
}
}
এই গণিত সম্পত্তি সহ, আমরা বর্তমান প্রথম উত্তরদাতা এটি নীচে থেকে উপরে পর্যন্ত সন্ধান করতে পারি যদি তা না হয় UIView। উদাহরণস্বরূপ, একটি থেকে viewকরতে UIViewControllerএটি পরিচালনার হচ্ছে যারা, যদি দৃশ্য নিয়ামক প্রথম উত্তর প্রদানকারী হয়।
তবে, আমাদের এখনও varপ্রথম শীর্ষ প্রতিক্রিয়া পেতে একটি শীর্ষ-রেজোলিউশন, একটি একক প্রয়োজন।
ভিউ হায়ারার্কি সহ প্রথম:
extension UIView {
var previousFirstResponder: UIResponder? {
return nextFirstResponder ?? subviews.compactMap { $0.previousFirstResponder }.first
}
}
এটি প্রথম প্রতিক্রিয়াশীলটিকে পিছনের দিকে সন্ধান করবে এবং এটি যদি এটি খুঁজে না পেল তবে এটির কাজগুলি পর্যালোচনাগুলিকে একই জিনিস করতে বলবে (কারণ এটির সাবভিউটি nextঅগত্যা নিজেই নয়)। এটির সহ আমরা যেকোন দর্শন থেকে এটি খুঁজে পেতে পারি UIWindow।
এবং অবশেষে, আমরা এটি তৈরি করতে পারি:
extension UIResponder {
static var first: UIResponder? {
return UIApplication.shared.windows.compactMap({ $0.previousFirstResponder }).first
}
}
সুতরাং আপনি যখন প্রথম উত্তরদাতা পুনরুদ্ধার করতে চান, আপনি কল করতে পারেন:
let firstResponder = UIResponder.first