-didSelectRowAtIndexPath:لا يتم استدعاؤه
-
05-07-2019 - |
سؤال
أنا أكتب تطبيق iOS مع عرض جدول داخل عرض علامة التبويب.في UITableViewController
, لقد نفذت -tableView:didSelectRowAtIndexPath:
, ، ولكن عندما أحدد صفًا في وقت التشغيل، لا يتم استدعاء الطريقة.على الرغم من ذلك، يتم ملء عرض الجدول، لذلك أعلم أنه يتم استدعاء طرق عرض الجدول الأخرى في وحدة التحكم الخاصة بي.
هل لدى أي شخص أي أفكار عما قد أفسدته لتحقيق ذلك؟
المحلول
وهذا يبدو وكأنه ربما الطبقة ليست UITableViewDelegate
لهذا الرأي الطاولة، وإن كان من المفروض UITableViewController
لتعيين هذا تلقائيا.
وأي فرصة لك إعادة تعيين مندوب لبعض فئة أخرى؟
نصائح أخرى
وفقط في حال قدم شخص ما نفس الخطأ غبي كما فعلت:
وتحقق ما إذا كان قد قصد أن حصلت didSelect
اسم الأسلوب من ما كنت تتوقع من كونها didDeselect
بطريقة أو بأخرى. واستغرق حوالي ساعتين بالنسبة لي لمعرفة ...
ولم يتم تحديد شيء آخر قد يؤدي إلى قضية نوع الاختيار:
وينبغي أن Single Selection
لاختيار العادية، يجب أن <م> لا م> أن No Selection
.
وهناك احتمال آخر هو أن UITapGestureRecognizer يمكن أن يكون تناول الأحداث، كما كان الحال هنا: https://stackoverflow.com/a / 9248827/214070
لم أكن أظن أن هذا سبب، لأن خلايا الجدول ما زال تسليط الضوء الأزرق كما لو أن الصنابير كانوا يحصلون من خلالها.
جميع الإجابات جيدة، ولكن هناك واحدة أخرى يجب البحث عنها ...
(خاصة عند إنشاء UITableView برمجياً)
تأكد من أن tableView يمكنه الاستجابة للاختيار من خلال الإعداد [tableView setAllowsSelection:YES];
أو إزالة أي سطر يحدده NO
.
إذا ظهرت المشكلة مع UITapGestureRecognizer
يمكنك إصلاح هذا:
- في القصة المصورة:
في الكود مع Objective-C
:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
[tap setCancelsTouchesInView:NO];
في الكود مع Swift
:
let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)
tap.cancelsTouchesInView = false
لقد واجهت شيئين في هذه المواقف.
ربما تكون قد نسيت تطبيق بروتوكول UITableViewDelegate، أو لا يوجد منفذ تفويض بين صفك وعرض الجدول الخاص بك.
قد يكون لديك UIView داخل الصف الخاص بك وهو المستجيب الأول ويمنع نقراتك.قل UIButton أو شيء مشابه.
وكان لي نفس المشكلة. وكان من الصعب العثور عليها. لكن في مكان ما في قانون بلدي كان هذا:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
return nil;
}
ويجب return indexPath
و، لا يتم استدعائه -tableView:didSelectRowAtIndexPath:
آخر.
إذا قمت بإضافة gestureRecognizer على رأس UITableView، didSelectRowAtIndexPath
لن الحصول على استدعاء.
ولذا تحتاج إلى استخدام gestureRecognizer طريقة مندوب لتجنب اللمس في عرض خاص.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isDescendantOfView:YourTable]) {
return NO;
}
return YES;
}
ولقد واجهت مشكلة حيث بعد شهور من لا تبحث في قانون بلدي لقد نسيت أنني نفذت الطريقة التالية بسبب بعض المتطلبات التي لم تكن ضرورية
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{
return NO;
}
ووينبغي أن تعود YES لصف لكي تجعل من اختيار.
وكنت قد وضعت UITapGestureRecognizer
على وجهة نظري الجدول لفصل لوحة المفاتيح التي منعت didSelectRowAtIndexPath:
من يتم استدعاء. آمل أن يساعد شخص ما.
في حال كان لديك نفس مشكلتي:على ما يبدو، لن يتم استدعاء هذه الطريقة إذا كان عرض الجدول الخاص بك في وضع التحرير.يجب عليك تعيين المسموح به لاختيار DuringEditing إلى true.
عبر هذا السؤال: عند التحرير، لا يستدعي `UITableView` didSelectRowAtIndexPath ؟؟
وكان لي نفس المشكلة،
والسبب كان يستخدم من UITapGestureRecognizer
. أردت لوحة المفاتيح لاقالة عندما استغلالها في أي مكان آخر. أدركت أن هذا يتجاوز جميع الإجراءات الحنفية، وهذا هو السبب، لم ظيفة didSelectRowAtIndexPath
لا يسمى.
عند أعلق الصفوف ذات الصلة مع UITapGestureRecognizer
، وأنها تعمل. وعلاوة على ذلك يمكنك التحقق في وظيفة UITapGestureRecognizer selector
إذا كان استغلالها هو UITableViewCell
أم لا.
وعلى الرغم من إجابة أخرى قد قبلت، سأضيف واحد أكثر مشكلة الممكنة وحل للأشخاص الذين يراقبون هذه المشكلة:
إذا كان لديك حساب مرجع التلقائي (ARC) قيد التشغيل، قد تجد أنه حتى بعد تعيين جهاز تحكم كمندوب للنظر، لم يتم تلقي الرسائل من طريقة العرض إلى وحدة تحكم لARC تم حذف وحدة تحكم. يبدو مؤشر مندوب UITableView للا يعتبر مرجعا للARC، لذلك إذا كان هذا هو المرجعية الوحيدة لذلك، سيتم dealloc'd وحدة تحكم. يمكنك التحقق من ما إذا كان هذا يحدث من خلال تنفيذ طريقة dealloc على وحدة تحكم ووضع مكالمة نقطة توقف أو NSLog هناك.
والحل هو أن تتبع وحدة تحكم مع إشارة قوية إلى مكان آخر، حتى كنت متأكدا من أنك لن تحتاج بعد الآن.
وتذكر لتعيين مصدر بيانات ومندوب في طريقة viewDidLoad كما يلي:
[self.tableView setDelegate:self];
[self.tableView setDataSource:self];
وكانت مشكلتي لا شيء مما سبق. وحتى عرجاء. لكنني اعتقد انني سوف قائمة هنا في حالة أنه يساعد شخص ما.
ولدي tableViewController
التي هي لغتي "القاعدة" وحدة تحكم وبعد ذلك إنشاء أقسام فرعية من وحدة التحكم هذه. كنت أكتب كل ما عندي من التعليمات البرمجية في روتين tableView:didSelectRowAtIndexPath
في فئة "القاعدة". متناسين تماما أن افتراضيا هذا الروتين كما تم خلق (وإن كان ذلك مع أي رمز أن تفعل أي شيء) في كل من الفئات الفرعية بلدي أيضا. لذلك عندما جريت بلدي التطبيق، وتجلى ذلك في نسخة فرعية من القانون، لم تفعل شيئا، وجعلني حزينا. وذلك بطبيعة الحال، بمجرد أن إزالة الروتين من الفئات الفرعية، فإنه يستخدم طن متري "القاعدة" الطبقة الروتين وأنا في مجال الأعمال التجارية.
وأنا أعلم. لا تضحك. ولكن ربما هذا سيوفر شخص ساعة فقدت ...
وإعطاء بلدي 2 سنت في هذا الشأن.
وكان لي UITableViewCell مخصص وكان هناك زر تغطي الخلية بأكملها، لذلك عندما وقع تعمل باللمس، تم اختيار زر وليس الخلية.
وإما إزالة زر أو في حالتي، أنا وضعت Interation العضو تمكين إلى false على زر، وبهذه الطريقة الخلية تم اختيار واحد.
إذا قرأت هذا، فلا يزال لا يحل المشكلة.
أملك مخصص الخلية، حيث مربع الاختيار "تم تمكين تفاعل المستخدم"تم تعطيل.لذلك، أنا فقط تشغيله.حظ سعيد.
ولقد كان هذا وكما حدث لي في الماضي أنه لم ينجح لأنني لم تدفع الانتباه إلى الإكمال التلقائي عند محاولة إضافة الطريقة وأنا فعلا في نهاية المطاف تنفيذ tableView:didDeselectRowAtIndexPath
: بدلا من tableView:didSelectRowAtIndexPath:
وأنا أعلم قديمة وتحل المشكلة، ولكن مشكلة مماثلة كان، وأعتقد أن المشكلة كانت مع عادتي UITableViewCell، ولكن الحل مختلفة تماما - I إعادة كسكودي :) ومن ثم يعمل موافق! تقريبا مثل ويندوز:)
إذا عرض الجدول الخاص بك في وضع التحرير (على سبيل المثال. [tableView setEditing:YES animated:NO];
)، تحتاج إلى تعيين tableView.allowsSelectionDuringEditing = YES;
تأكد من أنك تنفذ tableView:didSelectRowAtIndexPath
وليس tableView:didDeSelectRowAtIndexPath
ووحصلت لي هذا على أكثر من بضع مناسبات !!
وخطأ آخر كنت قد قمت به (كما فعلت): إذا قمت بتعيين سغ] في الخلية، لا يسمى didSelectRowAtIndexPath
. يجب تعيين segues على الخاص بك في وحدة تحكم عرض بدلا من ذلك.
وأي من هذه الإجابات عملت بالنسبة لي. بعد نحو ساعة، وأنا أحسب شيئا خبيثا جدا:
ولدي وجهة نظر جدول داخل خلية عرض جدول آخر. قررت أن تجعل وجهة نظر إرفاق الذي يحتوي على عرض الجدول الداخلية، من بين أمور أخرى. دعوت هذا الرأي contentView ومدمن مخدرات ليصل في xib.
وتبين أن UITableViewCell لديها بالفعل contentView ويفعل أشياء غريبة معه. قضية حل نفسها عندما أنا سميت الخاصية إلى mainContentView وإعادة الاتصال وجهة النظر إلى هذه الخاصية إعادة تسميته.
في حالتي، أنا حيوي حساب ارتفاع TableView
وSuperView
في وقت التحميل. نظرا لسوء تقدير، وكان وضعه في TableView
خارج SuperView
. وجه TableView
على ما يرام، ولكن تم تعطيل كافة التفاعل (وdidSelectRowAtIndexPath
دعا أبدا). من الصعب جدا اكتشاف، حيث لا يوجد إشارة مرئية أن TableView
ليست "الوصول".
في حالتي كان الحل لتغيير NO YES لفي وظيفة أقل.
ودائرة الرقابة الداخلية 9 +
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
وطيب، واستكمال هنا وأنا ركض للتو في هذه المشكلة، وكان قضيتي مختلفة قليلا من العثور عليها هنا.
ونظرت في IB ورأى أن بلدي مندوب أنشئت، ولكن تم تعيينها بشكل غير صحيح لعرض بدلا من مالك ملف في (انقر على الحق في عرض جدول لنرى أين مندوب يشير إلى).
وعلى أمل أن يساعد شخص ما