سؤال

أنا أكتب تطبيق 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 يمكنك إصلاح هذا:

  • في القصة المصورة:

enter image description here

في الكود مع 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

لقد واجهت شيئين في هذه المواقف.

  1. ربما تكون قد نسيت تطبيق بروتوكول UITableViewDelegate، أو لا يوجد منفذ تفويض بين صفك وعرض الجدول الخاص بك.

  2. قد يكون لديك 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 لصف لكي تجعل من اختيار.

ويجب تحديد هذه الخيارات

ولكن إذا كنت تريد أن تجعل UITableViewnot سلط الضوء على النقر ثم يجب إجراء تغييرات في خصائص UITableViewCell.

واختيار الخيار لا يوجد لاختيار تماما مثل أدناه

وكنت قد وضعت UITapGestureRecognizer على وجهة نظري الجدول لفصل لوحة المفاتيح التي منعت didSelectRowAtIndexPath: من يتم استدعاء. آمل أن يساعد شخص ما.

في حال كان لديك نفس مشكلتي:على ما يبدو، لن يتم استدعاء هذه الطريقة إذا كان عرض الجدول الخاص بك في وضع التحرير.يجب عليك تعيين المسموح به لاختيار DuringEditing إلى true.

عبر هذا السؤال: عند التحرير، لا يستدعي `UITableView` didSelectRowAtIndexPath ؟؟

وكان لي نفس المشكلة،

والسبب كان يستخدم من UITapGestureRecognizer. أردت لوحة المفاتيح لاقالة عندما استغلالها في أي مكان آخر. أدركت أن هذا يتجاوز جميع الإجراءات الحنفية، وهذا هو السبب، لم ظيفة didSelectRowAtIndexPath لا يسمى.

عند أعلق الصفوف ذات الصلة مع UITapGestureRecognizer، وأنها تعمل. وعلاوة على ذلك يمكنك التحقق في وظيفة UITapGestureRecognizer selector إذا كان استغلالها هو UITableViewCell أم لا.

لكسكودي 6.4، 1.2 سويفت. وكان اختيار "العلامة" تم تغيير في IB. أنا لا أعرف لماذا وكيف. تعيين إلى "اختيار واحد" جعلت لي خلايا عرض جدول اختيار مرة أخرى.

في حالتي، لم يتم الاتصال بـ didSelctRowAtIndexPath بسبب أنني قمت بتحديده لا أحد في ال اختيار خاصية tableView، تم ضبطها على اختيار واحد حل مشكلتي

enter image description here

وعلى الرغم من إجابة أخرى قد قبلت، سأضيف واحد أكثر مشكلة الممكنة وحل للأشخاص الذين يراقبون هذه المشكلة:

إذا كان لديك حساب مرجع التلقائي (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 ورأى أن بلدي مندوب أنشئت، ولكن تم تعيينها بشكل غير صحيح لعرض بدلا من مالك ملف في (انقر على الحق في عرض جدول لنرى أين مندوب يشير إلى).

وعلى أمل أن يساعد شخص ما

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top