استفاده از متغیری که داخل متد یک کلاس قراردارد در ViewController
باسلام و احترام
مدتیست قصد دارم از متغییری بنام TitrMainNews که داخل متدی در کلاس JsonClass قرار دادم در ViewController استفاده کنم ولی متاسفانه هر کدوم از آموزشهارو مطالعه کردم نتونستم به جواب برسم و همچنان بهش دسترسی ندارم
کلاس مربوطه رو در ذیل قرار میدم
import UIKit
class JsonClass{
var URLJson = URL(string: "http://logowall.ir/wp/api/get_posts")
var strPosts = ""
var strTitle = ""
internal func funcJson(strPosts:String , strTitle:String) {
let session = URLSession.shared
let task = session.dataTask(with: URLJson!, completionHandler:
{ (data, response, error) -> Void in
do {
let teamJSON = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String:Any]
let jsonArray = teamJSON
let posts = jsonArray [strPosts] as! NSArray
let count = (posts . count)
for i in 0 ..< count
{
var TitrMainNews : String = ""
DispatchQueue.main.async(execute:{ () -> Void in
TitrMainNews.append (( posts [i] as! NSDictionary)[strTitle]as! String)
})
}
}
catch
{
print("Error")
}
})
task.resume()
}
}
ضمنا همونطور که مطلعید میخوام در تابع ذیل که از توابع ViewController هست این متغییر رو استفاده کنم
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let LetCellMainNews = tableView.dequeueReusableCell(withIdentifier: "CellMainNews", for: indexPath) as! TVCMainNews
let JsonClassObject = JsonClass()
JsonClassObject.funcJson(strPosts: "posts", strTitle: "title")
LetCellMainNews .labelTitrCellMainNews .text = ??????????????
return LetCellMainNews
}
سلام ،
متغیری که شما ایجاد کردید با نام TitrMainNews داخل حلقه for تعریف شده پس از بیرون دیده نمیشه برای اینکه از بیرون دیده بشه باید به یک property تبدیلش کنید .
در نهایت ، ابتدا باید یک نمونه از روی کلاستون بسازید و سپس از متغیر استفاده کنید .
من این متغییر رو به بیرون از حلقه و به صورت property هم قرار دادم و همونطور که در پست قبلی میبینید نمونه هم میسازم ولی یا مقدار قبل از حلقه رو برمیگردونه یا کلا بهش دسترسی ندارم
البته شاید در ViewController این مشکل برام ایجاد میشه
import UIKit
class JsonClass{
var URLJson = URL(string: "http://logowall.ir/wp/api/get_posts")
var strPosts = ""
var strTitle = ""
var TitrMainNews : String = "a"
internal func funcJson(strPosts:String , strTitle:String)->String {
let session = URLSession.shared
let task = session.dataTask(with: URLJson!, completionHandler:
{ (data, response, error) -> Void in
do {
let teamJSON = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String:Any]
let jsonArray = teamJSON
let posts = jsonArray [strPosts] as! NSArray
let count = (posts . count)
for i in 0 ..< count
{
DispatchQueue.main.async(execute:{ () -> Void in
self.TitrMainNews.append (( posts [i] as! NSDictionary)[strTitle]as! String)
})
}
}
catch
{
print("Error")
}
})
task.resume()
return TitrMainNews
}
}
زمانی که در حال برقراری ارتباط با سرور هستید نمیشه از Return استفاده کرد و باید مثل آموزشی که در خصوص دانلود است یا از Protocol یا Closure استفاده کنید .
اینکه کی سرور شما جواب درخواست کلاینت رو بده مشخص نیست پس باید در زمان گرفتن پاسخ داده را چاپ کنید .
به زمان انتظار هم ربطی نداشت و تا اسکرول نمیکنم تصاویر مشاهده نمیشه
بله درسته
بعد از بررسي متوجه شدم دانلود بعد از ساختن سلول انجام ميشه و بايد مجددا بازخواني بشه
البته گويا reloadData() رو نميشه در تابع مرتبط با سلول استفاده كنم
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .