ইউআইটিএবলভিউসেল বিভাজনকারী iOS7 এ নিখোঁজ


129

আমি UITableViewকেবল আইওএস 7-তে কিছু অদ্ভুত সমস্যা পেয়েছি ।

UITableViewCellSeparatorপ্রথম সারির উপরে এবং শেষ সারির নীচে অদৃশ্য হয়ে যায়। কখনও কখনও সারি বা কিছু স্ক্রোলিং ক্রিয়াগুলি নির্বাচনের পরে এটি উপস্থিত হয়।

আমার ক্ষেত্রে স্টাইল সহ tableViewলোড করা হয় । সমস্যাটি অবশ্যই এতে নেই , যা ডিফল্ট থেকে পরিবর্তিত হয় না ।StoryboardUITableViewStylePlainUITableViewCellSeparatorStyleUITableViewCellSeparatorStyleSingleLine

আমি যেমন অ্যাপল দেব ফোরামগুলিতে পড়েছি ( এখানে এবং এখানে ) অন্যান্য লোকদেরও এ জাতীয় সমস্যা রয়েছে এবং কিছু কাজের সন্ধান পাওয়া যায়, উদাহরণস্বরূপ:

Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.

তবে আমি এখনও এই জাতীয় বিভাজক অদ্ভুত আচরণের কারণ অনুসন্ধান করছি।

কোন ধারনা?

আপডেট: আমি এক্সকোড 5.1 ডিপি এবং আইওএস 7.1 বিটাতে দেখেছি, অ্যাপল এই সমস্যাটি সমাধান করার চেষ্টা করেছিল। বিভাজককে কিছুটা রিফ্রেশ করার পরেও শেষ সারিটির নীচে কখনও কখনও প্রয়োজন হিসাবে দেখানো হয় তবে টেবিলভিউ তৈরির পরে নয়।


19
কখনও কখনও আমি iOS7 মনে হয় তাই অপরিণত। এটি এবং আমার এখানে থাকা জিনিসগুলির দীর্ঘ তালিকাটি দেখায় যে পূর্ববর্তী আইওএসগুলির পরিপূর্ণতা থেকে iOS7 কতটা দূরে।
বিএমএস 270

1
অ্যাপল দ্বারা সেটিংস অ্যাপ্লিকেশন একই সমস্যা, তাই আমি বিশ্বাস করি এটি একটি আইওএস 7 ইস্যু। আমি এটি প্রতিবেদন করেছি এবং তাদের ফলোআপে তারা সমস্যাটি দেখানোর চিত্র চেয়েছিল।
জোহান

@ গাটাডা সেটিংস অ্যাপে আপনি কোথায় সমস্যাটি দেখছেন?
জেমি ফরেস্ট

2
একই সমস্যাটি মোকাবিলা করে এবং [সেল সেটসেপেটরআইনসেট: ইউআইএডিজআইএনসেটস ফ্রমস্ট্রিং (@ "1")] যোগ করে ঠিক করা হয়েছে; (ইউআইটিএবলভিউসেল *) টেবিল ভিউ সহ: (ইউআইটিএলভিউ *) টেবিল ভিউ সেলফরআউটইন্ডেক্সপথ: (এনএসআইন্ডেক্সপথ *) সূচিপথ পদ্ধতি
আয়েশা ফাতেমা

1
এটি এখনও আইওএস 8.0 বিটাতে ভাঙ্গা বলে মনে হচ্ছে। আমি 17724043 রাডারটি খুলেছি যাতে কারও এটি ডুবিয়ে ফেলার যত্ন নেওয়া উচিত।
অ্যান্ডি উইলকিনসন

উত্তর:


77

আমি প্রভাবিত কক্ষগুলির সাবউভিউ হায়ারার্কি ফেলে দিয়েছি এবং দেখতে পেয়েছি যে এটি _UITableViewCellSeparatorViewলুকিয়ে আছে। অবাক হওয়ার কিছু নেই!

আমি layoutSubviewsআমার UITableViewCellসাবক্লাসে ওভাররড করেছি এবং এখন বিভাজকগুলি নির্ভরযোগ্যভাবে প্রদর্শিত হচ্ছে:

উদ্দেশ্য-সি :

- (void)layoutSubviews {
    [super layoutSubviews];

    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

দ্রুত :

override func layoutSubviews() {
    super.layoutSubviews()

    guard let superview = contentView.superview else {
        return
    }
    for subview in superview.subviews {
        if String(subview.dynamicType).hasSuffix("SeparatorView") {
            subview.hidden = false
        }
    }
}

এখানে প্রস্তাবিত অন্যান্য সমাধানগুলি আমার পক্ষে ধারাবাহিকভাবে কাজ করে না বা খাঁটি বলে মনে হয় না (কাস্টম 1 পিক্সের পাদলেখ দেখায়)।


আমি আপনার পদ্ধতিটি ব্যবহার করেছি তবে সাবক্লাসে নয় আমি ইউআইটিএবলভিউলে একটি বিভাগ যুক্ত করেছি। এটা আমাকে সাহায্য করেছে। ধন্যবাদ।
ভিটালি বুয়্যারস্কি

অবশ্যই এটি একটি বিভাগেও সম্ভব। যেহেতু এর জন্য পদ্ধতি সুইজলিংয়ের প্রয়োজন, তাই আমি সহজ সাবক্লাস পদ্ধতির জন্য গিয়েছিলাম।
অর্টউইন জেন্টজ

3
এটি আমার জন্য কাজ করা একমাত্র সমাধান। আমার সমস্যাটি পপ আপ হয়েছে যেখানে ইউআইটিএবলভিউতে স্ক্রোলযোগ্য হওয়ার জন্য পর্যাপ্ত সারি ছিল। সেই "হ্যাশফিক্স:" অংশটি যদিও বেশ নাজুক।
জুহান_h

আমার জন্য কাজ কর. হয়তো প্রশ্নটি নির্বোধ, তবে এটি কি ব্যক্তিগত এপিআই ব্যবহার করছে না?
ফোরইগার


42

এটি আমার পক্ষে কাজ করেছে:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // fix for separators bug in iOS 7
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

আপনি আরও বেশি ভোটের প্রাপ্য, এটাই আমার প্রয়োজন ছিল, আমি এটিকে একটি বিভাগে যুক্ত করেছি, সুতরাং এখন আমি [টেবিলভিউ রিলোডলোড ডেটা] করার পরে যদি এই বাগটি ঘটে (আমার ক্ষেত্রে যে ফুটার বিভাজকটি লুকিয়ে ছিল তা আবার প্রদর্শিত হচ্ছে), আমি কল করি [টেবিলভিউ পুনরায় লোডকারীদের];
নিসস্ক্রিপ্ট

12

আমিও বিভাজক অনুপস্থিত সঙ্গে সমস্যা ছিল এবং আমি বুঝতে পারলাম যে সমস্যা শুধুমাত্র ঘটেছে যখন heightForRowAtIndexPathছিল একটি দশমিক সংখ্যা ফেরার । সমাধান:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return ceil(yourHeight) // Ceiling this value fixes disappearing separators
}

1
আমি যদি উচ্চতার জন্যওআরআউটআইডেক্সপথ পদ্ধতিটি প্রয়োগ না করি তবে কী হবে?
বিএস

মজাদার. যাইহোক, এটি আমার প্রকল্পেও ঘটে - এবং উচ্চতারফআউটআইডেক্সপথ বাস্তবায়িত হয়নি। আইবি সারিতে / ঘরের উচ্চতা 100
জোহান

6
এটি আমার জন্য সমস্যাটি সমাধান করেনি এবং আমার কাছে উচ্চতারফআউটএন্টেক্সপথ পদ্ধতি রয়েছে।
জর্জলি কোভাকস

সমস্যাটি অন্তত আংশিকভাবে সমাধান করে। সেলটি অ-পূর্ণসংখ্যার উচ্চতা সম্পর্কে বিভ্রান্ত বলে মনে হচ্ছে।
নিক ফ্রোলভ

দশমিক হতে ঠিক আছে পয়েন্ট পেতে আপনাকে পিক্সেলের সংখ্যা সিল করতে হবে এবং তারপরে স্ক্রিন স্কেল ফ্যাক্টর দ্বারা ভাগ করতে হবে। আপনি যদি এটি না করেন তবে এটি রেটিনা অনুকূলিত হবে না।
trss s

11

আপনি কি হালকা ধূসর পটভূমির রঙের সাথে শিরোনাম এবং টেবিলের ফুটারে উচ্চতা 1 এর একটি ইউআইভিউ যুক্ত করার চেষ্টা করেছিলেন? মূলত এটি প্রথম এবং শেষ বিভাজককে উপহাস করবে।


এটি ভাল শোনাচ্ছে, তবে আপনি ঠিক কীভাবে এটি করেন? ভিউফুটার ব্যবহার করবেন?
skinsfan00atg

1
এটি যতটা শোনাচ্ছে তত সহজ নয়, কিছু কারণে আমাকে হাইটফুফুটারও প্রয়োগ করতে হয়েছিল অন্যথায় ইনিউইথফ্রেমে নির্দিষ্ট করা উচ্চতা উপেক্ষা করা হয়েছিল। আমি আরও লক্ষ্য করি যে হালকা রং রঙ একই রঙ নয় তাই এটি সত্যিই কাজ করবে না। একটি কাস্টম ধূসর করতে হতে পারে
skinsfan00atg

এটি বেশ
জঙ্কি

হ্যাঁ আমি পুরোপুরি একমত। আইওএস's এর মুক্তির ঠিক পরেই এটি আমি একমাত্র কর্মপরিকল্পনা পেয়েছি, এখনকার চেয়ে আরও ভাল কোন উপায় আছে কি?
এয়ারপলগ

2
রঙটি মেলানোর জন্য, টেবিলভিউ.সেস্পোর্টর রঙ ব্যবহার করুন
জেফ

8

@samvermette

আমি এই প্রতিনিধি পদ্ধতি ব্যবহার করে সমস্যার সমাধান করেছি। এখন এটি ঝাঁকুনি না:

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}


-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}

7

আমরা আমাদের অ্যাপ্লিকেশনটিতে এই সমস্যার মুখোমুখি হয়েছি। যখন ব্যবহারকারী কোনও ঘর নির্বাচন করেছেন, একটি নতুন টেবিল ভিউটি নেভিগেশন কন্ট্রোলার স্ট্যাকের দিকে ঠেলে দেওয়া হয়েছিল এবং তারপরে ব্যবহারকারী যখন এটি পপ করে ফেলেছিল তখন বিভাজকটি অনুপস্থিত ছিল। আমরা নির্বাণ দ্বারা এটি মীমাংসিত [self.tableView deselectRowAtIndexPath:indexPath animated:NO];মধ্যে didSelectRowAtIndexPathটেবিল ভিউ প্রতিনিধি পদ্ধতি।


আপনি চেষ্টা করেছেন self.tableView.allowsMultipleSelection = NO;?
ক্রাইটাইটাক

6

এখানে একটি সহজ (যদিও কিছুটা অগোছালো) ওয়ার্কারআউন্ড আপনার যদি প্রয়োজন হয়, ডেটা পুনরায় লোড করার পরে এবং ডিফল্ট অ্যানিমেশন সম্পন্ন করার পরে সেলটি নির্বাচন এবং অনির্বাচিত করার চেষ্টা করুন।

শুধু যোগ কর:

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];

1
এই কাজটি আমার জন্য এটি স্থির করে; যাইহোক, আমি এটি বিপরীত - নির্বাচন ধরে রাখতে। সুতরাং, প্রথমে নির্বাচন মুক্ত করুন, তারপরে পুনরায় নির্বাচন করুন।
জোহান

2
আপনি "ডেটা পুনরায় লোড করার পরে" বললে কী ওভাররাইড করতে হবে তা আমি জানি না
এয়ারপলগ

6

আমি খুঁজে পেয়েছি যে কোনও ঘর পুনরায় লোড করার পরে উপরের ঘরটিও পুনরায় লোড করার সবচেয়ে সহজ সমাধান solution

if (indexPath.row > 0) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section];
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];
}

1
আমার জন্য কাজ করেছেন। ধন্যবাদ। অন্য কোনও পদ্ধতি আমাকে সহায়তা করেনি (সামভারমেটের উত্তর থেকে পৃথককারী শৈলীর পরিবর্তন অন্তর্ভুক্ত)।
surfrider

4

একটি সহজ এবং পরিষ্কার সমাধান যা আইওএস 8 এবং আইওএস 9 (বিটা 1) উভয় ক্ষেত্রেই কাজ করে

এখানে একটি সাধারণ, পরিষ্কার এবং অ-অনুপ্রেরণামূলক কাজ রয়েছে। এটিতে একটি বিভাগের পদ্ধতি কল করা জড়িত যা পৃথককারীদের ঠিক করবে।

আপনাকে যা করতে হবে তা হল কক্ষের শ্রেণিবিন্যাসের নীচে হাঁটা এবং বিভাজকটি আন-লুকানো। এটার মত:

for (UIView *subview in cell.contentView.superview.subviews) {
    if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
        subview.hidden = NO;
    }
}

আমি যা প্রস্তাব দিচ্ছি তা হ'ল এটিকে ইউআইটিএবলভিউসিলের কোনও বিভাগে যুক্ত করা:

@interface UITableViewCell (fixSeparator)
- (void)fixSeparator;
@end

@implementation UITableViewCell (fixSeparator)

- (void)fixSeparator {
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

@end

যেহেতু বিভাজক বর্তমানে নির্বাচিতটির চেয়ে পৃথক কক্ষে অদৃশ্য হয়ে যেতে পারে , সারণী প্রদর্শনের সমস্ত কক্ষে এই ফিক্সটিকে কল করা সম্ভবত একটি ভাল ধারণা । তার জন্য, আপনি ইউআইটিএবলভিউতে এমন একটি বিভাগ যুক্ত করতে পারেন যা এরকম হয়:

@implementation UITableView (fixSeparators)

- (void)fixSeparators {
    for (UITableViewCell *cell in self.visibleCells) {
        [cell fixSeparator];
    }
}

@end

এই জায়গায় -fixSeparatosএটির সাহায্যে, আপনি অদৃশ্য হয়ে যাওয়ার কারণের ক্রিয়া শেষে আপনার টেবিলভিউতে কল করতে পারেন । আমার ক্ষেত্রে, এটি কল করার পরে [tableView beginUpdates]এবং [tableView endUpdates]

আমি প্রথমদিকে যেমন বলেছি, আমি এটি iOS 8 এবং iOS 9. উভয়তেই পরীক্ষা করেছি I আমি ধারণা করি এটি আইওএস 7-তেও কাজ করবে তবে আমার এটির চেষ্টা করার উপায় নেই। আপনি সম্ভবত অবগত যেহেতু এটি ঘরের অভ্যন্তরগুলির সাথে কোলাহল করবে যাতে এটি ভবিষ্যতের কিছু প্রকাশে কাজ বন্ধ করতে পারে। এবং অ্যাপল তাত্ত্বিকভাবে (0.001% সুযোগ) এর কারণে আপনার অ্যাপ্লিকেশনটিকে প্রত্যাখ্যান করতে পারে, তবে আমি দেখতে পাচ্ছি না যে তারা কীভাবে আপনি সেখানে কী করছেন তাও আবিষ্কার করতে পারে (স্ট্যাটিক বিশ্লেষকরা কোনও শ্রেণির প্রত্যয় পরীক্ষা করে কিছু সনাক্ত করতে পারে না) খারাপ, আইএমও)।


হ্যাঁ. এটি আমার পক্ষে কাজ করেছে, সুইফটের সর্বশেষতম সংস্করণে রূপান্তর করার পরে। টেবিলভিউ.এন্ডআপডেটস () এ প্রতিটি কল করার পরে ফিক্সসেপেটরকে কল করার জন্য ++।
উদ্দেশ্যটিসিটি

1
আমি আনন্দিত এটি আপনার জন্য সহায়ক ছিল! আমি সত্যই বিশ্বাস করি এটিই সেরা সমাধান, সুতরাং আশা করি আরও বেশি লোক এটি আবিষ্কার করবে।
লুকাস পেটর

4

@ অর্টউইন-হলেনটজের মন্তব্যের ভিত্তিতে, আইওএস 9 এ এই সমাধানটি আমার পক্ষে কাজ করে।

func fixCellsSeparator() {

    // Loop through every cell in the tableview
    for cell: UITableViewCell in self.tableView.visibleCells {

        // Loop through every subview in the cell which its class is kind of SeparatorView
        for subview: UIView in (cell.contentView.superview?.subviews)!
            where NSStringFromClass(subview.classForCoder).hasSuffix("SeparatorView") {
                subview.hidden = false
        }
    }

}

(সুইফট কোড)

আমি আমার টেবিলভিউয়ের কয়েকটি পদ্ধতিতে এন্ডআপডেটস () কে কল করার পরে ফিক্সসেলসপেটেরেটর () ফাংশনটি ব্যবহার করি, উদাহরণস্বরূপ:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    //  Perform some stuff
    //  ...

    self.tableView.endUpdates()
    self.fixCellsSeparator()

}

আমি আশা করি এই সমাধানটি কারও পক্ষে সহায়ক হবে!


2

এয়ারপলজের উত্তরের পরিপূরক।

সুতরাং মূলত একজনকে দুটি ইউআইটিবেবলডিলেট পদ্ধতি প্রয়োগ করতে হবে। এখানে আমার সমাধান যা iOS7 এবং iOS6 উভয় ক্ষেত্রেই কাজ করে।

#define IS_OS_VERSION_7 (NSFoundationVersionNumber_iOS_6_1 < floor(NSFoundationVersionNumber))

#define UIColorFromRGB(hexRGBValue) [UIColor colorWithRed:((float)((hexRGBValue & 0xFF0000) >> 16))/255.0 green:((float)((hexRGBValue & 0xFF00) >> 8))/255.0 blue:((float)(hexRGBValue & 0xFF))/255.0 alpha:1.0]

// এটি পুরো স্ক্রিনটি coverেকে না রাখলে সেগুলি সেলগুলির নীচে খালি টেবিল গ্রিডটি আড়াল করবে

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    UIView *view = nil;

    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        CGFloat height = 1 / [UIScreen mainScreen].scale;
        view = [[UIView alloc] initWithFrame:CGRectMake(0., 0., 320., height)];
        view.backgroundColor = UIColorFromRGB(0xC8C7CC);
        view.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    }
    else
    {
        view = [UIView new];
    }
    return view;
}


- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        return 1 / [UIScreen mainScreen].scale;
    }
    else
    {
        // This will hide the empty table grid below the cells if they do not cover the entire screen
        return 0.01f;
    }
}

2

এটি আমার জন্য সমস্যাটি স্থির করে:

নিশ্চিত হয়ে নিন যে clipsToBoundsকক্ষটির জন্য হ্যাঁ সেট করা হয়েছে, তবে কোষটির জন্য কোনও নেই contentView। সেটও করেছেনcell.contentView.backgroundColor = [UIColor clearColor];


কক্ষ এবং সামগ্রী উভয়ের জন্য স্টোরিবোর্ডে ক্লিপসউভিউগুলিকে মিথ্যা হিসাবে সেট করা এই সমস্যাটি সমাধান করেছে! আরও বেশি ভোট দরকার!
ব্রেট

ক্লিপটোবাউন্ডগুলি YES এ কোষে সেট করা আমার পক্ষে যথেষ্ট ছিল।
রেনে জুউস

2

মনে হচ্ছে এই সমস্যাটি অনেক পরিস্থিতিতে উদ্ভাসিত হয়।

আমার জন্য এটি সেল নির্বাচনের সাথে কিছু করার ছিল। কেন খুব গভীরভাবে এটি খনন করার সময় আমার ছিল না এবং আমার কোনও ধারণা নেই, তবে আমি বলতে পারি যে আমি যখন ঘরের কোনওটি সেট না করেছিলাম তখনই এটি ঘটতে শুরু করেছিল selectionStyle। অর্থাৎ,

//This line brought up the issue for me
cell.selectionStyle = UITableViewCellSelectionStyleNone;

আমি উপরের কিছু প্রতিনিধি পদ্ধতি ব্যবহারের চেষ্টা করেছি যা টগল করে separatorStyle সম্পত্তিটির উপর এবং বাইরে চলে যায় tableViewতবে তারা আমার সমস্যা সমাধানের জন্য কিছুই করেনি বলে মনে হয়।

আমার এটির প্রয়োজনের পুরো কারণটি ছিল আমার এমনকি সেল নির্বাচনেরও প্রয়োজন ছিল না।

সুতরাং, আমি এমন কিছু খুঁজে পেয়েছি যা আমার পক্ষে কাজ করে। আমি সবেমাত্র নির্বাচনটি অক্ষম করেছি UITableView:

tableView.allowsSelection = NO;

আশা করি এটির কাউকে সহায়তা করে, যদি আপনার ঘর নির্বাচন করার প্রয়োজন না হয়।


2

আমি ঠিক করার জন্য অনেকগুলি পরামর্শ চেষ্টা করেছিলাম কিন্তু এটি ঠিক করতে পারছি না in শেষ পর্যন্ত আমি নীচের মত কাস্টম বিভাজক লাইনটি স্থির করার সিদ্ধান্ত নিয়েছি:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    var lineView = UIView(frame: CGRectMake(20, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width - 20, 1))

    lineView.backgroundColor = UIColor(red: 170.0/255.0, green: 170.0/255.0, blue: 170.0/255.0, alpha: 1)
    cell.contentView.addSubview(lineView)
}

পি / এস: কাস্টম willDisplayCell না cellForRowAtIndexPath


1

বেশ আশ্চর্যজনকভাবে, ঘরের separatorInsetমূল্য পিছনে পিছনে পিছনে পিছনে কাজ করা মনে হচ্ছে:

NSIndexPath *selectedPath = [self.controller.tableView indexPathForSelectedRow];
[self.controller.tableView deselectRowAtIndexPath:selectedPath animated:YES];

UITableViewCell *cell = [self.controller.tableView cellForRowAtIndexPath:selectedPath];
UIEdgeInsets insets = cell.separatorInset;
cell.separatorInset = UIEdgeInsetsMake(0.0, insets.left + 1.0, 0.0, 0.0);
cell.separatorInset = insets;

1

আমার ইউআইটিএবলভিউয়ের নীচে এই বেমানান বিভাজক লাইন প্রদর্শনের সমস্যাটিও ছিল। একটি কাস্টম ফুটার ভিউ ব্যবহার করে, আমি একটি অনুরূপ লাইন তৈরি করতে এবং এটি সম্ভাব্য বিদ্যমান একের (যা কখনও কখনও অনুপস্থিত ছিল) শীর্ষে প্রদর্শন করতে সক্ষম হয়েছি।

এই সমাধানের একমাত্র সমস্যাটি হ'ল অ্যাপল একদিন লাইনটির পুরুত্ব পরিবর্তন করতে পারে

- (UIView*) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    float w = tableView.frame.size.width;

    UIView * footerView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, w, 1)];
    footerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    footerView.clipsToBounds=NO;

    UIView* separatoraddon = [[UIView alloc] initWithFrame:CGRectMake(0, -.5, w, .5)];
    separatoraddon.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    separatoraddon.backgroundColor = tableView.separatorColor;
    [footerView addSubview:separatoraddon];

    return footerView;
}
- (CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 1;
}

1

আমি এই লাইনের কোডটি সংশোধন করেছি যেখানে টেবিলভিউয়ের আপডেট ঘটে:

self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;

উদাহরণস্বরূপ, আমার ক্ষেত্রে আমি সেগুলি এখানে রেখেছি:

tableView.beginUpdates()
tableView.insertRowsAtIndexPaths(insertIndexPaths, withRowAnimation: UITableViewRowAnimation.Fade)
tableView.endUpdates()
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;

1

আপনার ঘরের আপডেট করার আগে আপনাকে একটি সেল নির্বাচন অপসারণ করতে হবে। তারপরে আপনি নির্বাচনটি পুনরুদ্ধার করতে পারেন।

NSIndexPath *selectedPath = [self.tableview indexPathForSelectedRow];
    [self.tableview deselectRowAtIndexPath:selectedPath animated:NO];
    [self.tableview reloadRowsAtIndexPaths:@[ path ] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableview selectRowAtIndexPath:selectedPath animated:NO scrollPosition:UITableViewScrollPositionNone];

1

উপরের সমস্যাটি ঠিক করতে ভিউডিডডোডে খালি ফুটার যুক্ত করুন।

UIView *emptyView_ = [[UIView alloc] initWithFrame:CGRectZero];   
emptyView_.backgroundColor = [UIColor clearColor];  
[tableView setTableFooterView:emptyView_];

দয়া করে ভিউফুটারআইনসেকশন প্রতিনিধি পদ্ধতিতে উপরের লাইনগুলি ব্যবহার করবেন না। মানে ভিউফোর্ডার ইনসেকশন পদ্ধতি বাস্তবায়ন করবেন না।


0

এয়ারপলগ উত্তরটি প্রসারিত করতে, কারণ এটি আমার পক্ষে পুরোপুরি কার্যকর হয়নি ..

উচ্চতা পেতে আমাকে উচ্চতাফুটার পদ্ধতিটিও প্রয়োগ করতে হয়েছিল

তারপরে আমি লক্ষ্য করেছি যে হালকা ধরণের রঙ খুব কালো। আমি টেবিলভিউয়ের বর্তমান বিভাজক রঙটি ধরে এবং এটি ব্যবহার করে এটি ঠিক করেছি:

UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];


0

আমাদের প্রকল্পেও আমি এই সমস্যায় পড়েছিলাম। আমার টেবিল ভিউতে একটি টেবিলফুটারভিউ ছিল যা এটি ঘটতে পারে। আমি খুঁজে পেয়েছি যে শেষ সারিটির নীচের বিভাজকটি উপস্থিত হবে যদি আমি সেই টেবিলফুটারভিউটি সরিয়ে ফেলি।


0

আমার পক্ষে কী পার্থক্য করেছিল যে সারিটি লোড করা হয়েছিল যার জন্য নীচের বিভাজক রেখাটি প্রদর্শিত হবে না:

NSIndexPath *indexPath = 
     [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];  
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

0

আমি এই সমস্যাটিকে অন্য উপায়ে সমাধান করব: এর স্তরটি যুক্ত করুন যা এর উচ্চতা 0.5px এবং এর রঙটি টেবিলভিউতে হালকা গ্রে able

কোডটি ঠিক এর মতো:

UIView *tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];
CALayer *topSeperatorLine = [CALayer layer];
topSeperatorLine.borderWidth = 0.5f;
topSeperatorLine.borderColor = [UIColor lightGrayColor].CGColor;
topSeperatorLine.frame = CGRectMake(0, 0, 320, 0.5f);
[tableFooterView.layer addSublayer:topSeperatorLine];
self.tableView.tableFooterView = tableFooterView;

0

আপনার ইউআইটিএবলভিউসেল সাবক্লাসে লেআউটসুভিউগুলি প্রয়োগ করে এবং যুক্ত করুন:

- (void)layoutSubviews{
    [super layoutSubviews]
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            CGRect separatorFrame = subview.frame;
            separatorFrame.size.width = self.frame.size.width;
            subview.frame = separatorFrame;
        }
    }
}

0

অন্য কেউ যেমন উল্লেখ করেছেন, এই সমস্যাটি বিভিন্ন উপায়ে প্রকাশিত হবে বলে মনে হয়। আমি নিম্নলিখিত সমস্যাগুলির মাধ্যমে আমার সমস্যাটি সমাধান করেছি:

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];

0

উত্তর এবং সমাধানগুলি দিয়ে আমি এই জাতীয় পর্যবেক্ষণগুলি নিয়ে এসেছি:

এটি আইওএস 7 এবং 8 উভয় ক্ষেত্রেই সমস্যাযুক্ত বলে মনে হচ্ছে কোড থেকে কোড নির্বাচন করার সময় আমি সমস্যাটি লক্ষ্য করেছি viewDidLoad পদ্ধতিতে যাতে:

1) viewDidAppear:যদি কেউ ভিউ উপস্থাপন করে এবং ঘরটি নির্বাচন করার মধ্যে লক্ষণীয় বিলম্বকে আপত্তি না করে তবে এইভাবে কাজ করা হয়েছিল

2) দ্বিতীয় সমাধানটি আমার পক্ষে কাজ করেছে তবে কোডটি অভ্যন্তরীণ বাস্তবায়নের ভিত্তিতে কোডটিকে কিছুটা ভঙ্গুর দেখায়UITableViewCell

3) নিজস্ব বিভাজক যুক্ত করা আপাতত সবচেয়ে নমনীয় এবং সেরা বলে মনে হচ্ছে তবে আরও কোডিং প্রয়োজন :)


0

viewWillAppearআমার জন্য কাজ করা শৈলী সেট করা ।


0

এটি এখনও আইওএস 8-এর একটি সমস্যা হিসাবে, আমি সুইফটে আমার সমাধানটি যুক্ত করব। টেবিলভিউ বিভাজক লাইনটি কারও কাছে সেট করুন না। তারপরে এই কোডটি সেলফোরআউএটিআইডেক্সপথ প্রতিনিধি পদ্ধতিতে যুক্ত করুন। এটি একটি দুর্দান্ত বিভাজক যোগ করবে। যদি বিবৃতিটি নির্ধারণ করতে দেয় যে কোন কোষের বিভাজক হওয়া উচিত।

    var separator:UIView!
    if let s = cell.viewWithTag(1000)
    {
        separator = s
    }
    else
    {
        separator = UIView()
        separator.tag = 1000
        separator.setTranslatesAutoresizingMaskIntoConstraints(false)
        cell.addSubview(separator)

        // Swiper constraints
        var leadingConstraint = NSLayoutConstraint(item: separator, attribute: .Leading, relatedBy: .Equal, toItem: cell, attribute: .Leading, multiplier: 1, constant: 15)
        var heightConstraint = NSLayoutConstraint(item: separator, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 0.5)
        var bottomConstraint = NSLayoutConstraint(item: cell, attribute: .Bottom, relatedBy: .Equal, toItem: separator, attribute: .Bottom, multiplier: 1, constant:0)
        var trailingConstraint = NSLayoutConstraint(item: cell, attribute: .Trailing, relatedBy: .Equal, toItem: separator, attribute: .Trailing, multiplier: 1, constant: 15)
        cell.addConstraints([bottomConstraint, leadingConstraint, heightConstraint, trailingConstraint])
    }

    if indexPath.row == 3
    {
        separator.backgroundColor = UIColor.clearColor()
    }
    else
    {
        separator.backgroundColor = UIColor.blackColor()
    }

0

এই সমস্যার আমার সমাধান এখানে। আপনি আপনার ঘর (গুলি) sertোকানোর পরে, বিভাগটি পুনরায় লোড করুন। যদি পুরো বিভাগটি পুনরায় লোড করা আপনার পক্ষে খুব নিবিড় হয় তবে কেবল উপরে এবং নীচে সূচিপথগুলি পুনরায় লোড করুন।

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    //  Fix for issue where seperators disappear

    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
}];

[self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade];

[CATransaction commit];

0

একটি অনুরূপ সমস্যার মধ্যে দৌড়েছি, আমি দেখতে পেলাম যে আরও একটি ভাল সমাধান, বিশেষত যদি আপনার ডাটাসোর্সটি বড় না হয় আপনি যখন -(void)scrollViewDidScroll:(UIScrollView *)scrollViewপদ্ধতিটি প্রয়োগ করেন তখন টেবিলডেটাটি পুনরায় লোড করা হয় , এখানে একটি উদাহরণ রয়েছে:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
      if (scrollView == self.tableView1) {
          [self.tableView1 reloadData];
      }

      else {
          [self.tableView2 reloadData];
      }
}

আপনি কেবল দৃশ্যমান ডেটা উত্সের উপর ভিত্তি করে অ-দৃশ্যমান ডেটা পুনরায় লোড করতে পারেন তবে এর জন্য আরও কিছু হ্যাকিং প্রয়োজন।

মনে রাখবেন এই প্রতিনিধি ফাংশনটি এর অধীনে আসে UITableViewDelegate প্রোটোকলের !

আশা করি এটা সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.