سؤال

أقوم بإنشاء جدول يحتوي على بعض النصوص بتنسيق HTML، لذلك أستخدم UIWebView كعرض فرعي لخلايا الجدول المخصصة.لقد واجهت بالفعل مشكلة واحدة - عندما قمت بالتمرير لأسفل في الجدول، سيستغرق تحديث UIWebViews ثانية واحدة.على سبيل المثال، سأعرض الخلايا في الصفوف المرقمة 1 و2 و3.سأنتقل للأسفل لأقول 8 و 9 و 10.للحظة، كان محتوى UIWebView الذي كان مرئيًا في الخلية رقم 8 هو المحتوى من الخلية رقم 1، والمحتوى الموجود في الخلية رقم 9 هو المحتوى من الخلية رقم 2، وهكذا.

تعلمت أن المشكلة تكمن في أن UIWebViews يعرض النص ببطء.تم اقتراح بدلاً من ذلك تحميل المحتوى مسبقًا في UIWebView بأسرع ما يمكن بدلاً من الانتظار حتى يتلقى الجدول cellForRowAtIndexPath.والآن، لدي كائن مجال كان يحتوي في السابق على محتوى النص الخاص بـ WebView - ولكنه الآن يحتوي في الواقع على إشارة إلى UIWebView نفسه.

ولكن الآن يتم عرض بعض المحتوى الموجود في UIWebView، وعندما أقوم بالتمرير عبر الجدول، يظهر UIWebView كمربع رمادي فقط.إذا لمست المربع الرمادي، فسوف يتلقى اللمس فعليًا ويقوم بتحديث WebView - على سبيل المثال، إذا لمست رابطًا (وهو ما قد أفعله أو لا أفعله، نظرًا لأن المربع رمادي اللون وسيكون ذلك بضربة حظ)، سيتم طلب الصفحة التي تم الارتباط بها وعرضها بشكل صحيح.

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
            // I suppose this isn't necessary since I am just getting it from the
            // Domain Object anyway
    content = [[UIWebView alloc] initWithFrame:CGRectZero];
    content.backgroundColor = [UIColor blackColor];
    [self addSubview:content];
    [content release];
}
return self;
}

// called by cellForRowAtIndexPath 
- (void)setMyDomainObject:(MyDomainObject*)anObject {
UIWebView *contentWebView = anObject.contentWebView;
int contentIndex = [self.subviews indexOfObject:content];
[self insertSubview:contentWebView atIndex:contentIndex];
}
هل كانت مفيدة؟

المحلول

إحدى طرق التعامل مع هذا الأمر هي استخدام العديد من ملصقات UILabels، كل منها بخطوط مختلفة.ثم ضعها بشكل استراتيجي داخل الخلية لجعلها تبدو وكأنها نص متجاور.لقد رأيت هذا يتم في UITableView بنتائج جيدة جدًا.

قد تكون مشكلة الأداء الأخرى هي أنك تتجاوز UItableViewCell وأسلوب init الخاص به.يؤدي هذا دائمًا إلى ضعف الأداء في UITableView.بدلاً من ذلك، ما عليك سوى استخدام مثيلات UITableViewCell العادية وإضافة عروض فرعية إلى عرض المحتوى الخاص بها.

وقد تمت تغطية هذا على نطاق واسع من قبل مات غالاغر رسم UITableView مخصص سهل.

هناك طريقة أخرى تم وصفها وهي استخدام Three20، والتي يمكن أن تمنحك نصًا منسقًا أيضًا.

ما تحاوله حاليًا لا يمكن تنفيذه باستخدام UIWebview.

التحميل المسبق لن يساعد:سيؤدي هذا إلى إبطاء واجهة المستخدم عندما يتم عرض UIWebviews خارج الشاشة؛يجب عليك دائمًا ممارسة التحميل البطيء على iPhone.

سيؤدي وضع UIWebviews في UITableView إلى نتيجة أداء غير مقبولة.سوف تحتاج إلى استخدام وسائل أخرى لتحقيق هدفك.

لسوء الحظ، NSAttributedString غير متوفر في UIKit، مما قد يحل مشكلتك بسهولة.

نصائح أخرى

وحتى هنا جوابي تحديث: لقد نفذت جدول باستخدام UIWebView واحدة كبيرة لوضع نص على غرار داخل خلايا الجدول في بلدي التطبيق العميل تويتر، <وأ href = "http://felttip.com/heltweetica/" يختلط = "noreferrer"> HelTweetica (مع المصدر المتاحة). أنه يعمل بشكل جيد جدا طالما كنت فهم كيفية القيام تخطيط في HTML و CSS.

وأنت مجرد خلق NSMutableString وإضافة خطوط HTML التي تشكل المستند. يمكنك يحيل الملفات الخارجية مثل ملفات CSS التي هي في رمل التطبيق الخاص بك. يمكنك تعيين الإجراءات URL مخصصة مثل "youraction: //file.txt" بأن ما تتمتعون به على شبكة الإنترنت رأي مندوب يمكن اعتراض والعملية باعتبارها IBActions بديل:

- (void) refreshWebView {
    TwitterAccount *account = [twitter currentAccount];
    NSMutableString *html = [[NSMutableString alloc] init];
    // Open html and head tags
    [html appendString:@"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"];
    [html appendString:@"<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"];
    [html appendString:@"<head>\n"];
    [html appendString:@"<meta name='viewport' content='width=device-width' />"];
    [html appendString:@"<link href='style-ipad.css' rel='styleSheet' type='text/css' />"];
    [html appendString:@"<script language='JavaScript' src='functions.js'></script>"];

    // Body
    [html appendString:@"</head><body><div class='artboard'>"];

    // [...]

    // Close artboard div, body. and html tags
    [html appendString:@"</div></body></html>\n"];

    NSURL *baseURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]];
    [self.webView loadHTMLString:html baseURL:baseURL];
    [html release];
}

ويمكنك تحميل أجزاء من الصفحة باستخدام جافا سكريبت:

- (void) refreshTabArea {
    NSString *html = [self stringByEscapingQuotes: [self tabAreaHTML]];
    NSString *js = [NSString stringWithFormat: @"document.getElementById(\"tab_area\").innerHTML = \"%@\";", html];
    [self.webView stringByEvaluatingJavaScriptFromString:js];
}

إذا يقتصر المحتوى في طريقة العرض على شبكة الإنترنت إلى نص نصب أو ارتباطات التشعبية التي قد ترغب في إلقاء نظرة على المشروع Three20: <لأ href = "http://github.com/joehewitt/three20/tree/master" يختلط = "نوفولو noreferrer"> http://github.com/joehewitt/three20/tree/master

عن الطبقة TTStyledText لديها دعم لعلامات <b>, <i>, <img>, and <a> في المحتوى. ربما أكثر وخفيفة الوزن من webviews.

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

وقال لك "التي دعا اليها setRowAtIndexPath"، قد تعني 'cellForRowAtIndexPath' وهو أسلوب UITableView تسمى عندما يصبح على التوالي مرئية ويحتاج إلى إنشاء خلية. تأكد من أن في هذه الطريقة التي يتم تهيئة وتحديث محتويات الخلية بشكل صحيح.

هل بحثت في تجاوز طريقة -prepareForReuse عبر رسائل فرعية الطاولة؟ إذا لا يبدو الخلايا لتحديث عند التمرير، فمن الممكن أن محتوى خلايا قابلة لإعادة الاستخدام لا يتم مسح وإعادة تعيين.

وما أفهمه هو أن عرض ويب لن تجعل إلا إذا كنت بدء التحميل منه بعد viewDidLoad () يحدث.

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