Используйте функцию callback()
внутри успеха foo()
. Попробуйте таким образом. Это просто и легко понять. & nbsp;
var lat = "";
var lon = "";
function callback(data) {
lat = data.lat;
lon = data.lon;
}
function getLoc() {
var url = "http://ip-api.com/json"
$.getJSON(url, function(data) {
callback(data);
});
}
getLoc();
Сбой показывает вам явно, что не так:
UICollectionView должен быть инициализирован с помощью параметра макета, отличного от нуля.
blockquote>Если вы проверьте документацию Apple для
UICollectionView
, вы обнаружите, что единственным инициализатором являетсяinitWithFrame:collectionViewLayout:
. Кроме того, в параметрах для этого инициализатора вы увидите:frame
Прямоугольник рамки для представления коллекции, измеренный в точках , Происхождение кадра относится к супервину, в котором вы планируете его добавить. Этот кадр передается суперклассу во время инициализации.
layout
Объект макета, используемый для организации элементов. В представлении коллекции хранится сильная ссылка на указанный объект. Не должно быть nil.
blockquote>Я выделил важную часть. Вы должны использовать
initWithFrame:collectionViewLayout:
для инициализации вашегоUICollectionView
, и вы должны передать ему объект non-nilUICollectionViewLayout
.
. Один из способов исправить это - просто изменить порядок инициализации:
UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc] init]; flowLayout.itemSize = CGSizeMake(100, 100); [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:flowLayout]; [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
Обратите внимание, что в приведенном выше примере я предположил, что вы хотите использовать
self.view.frame
в качестве кадраself.collectionView
. Если это не так, вставьте любой кадр, который вы хотите.
Swift 3.0 и Swift 4.0
UICollectionView
Приложение разбилось, как только оно было запущено, когда UICollectionView
инициализирован
инициализируется как ниже (выше viewDidLoad
)
let alarmCollectionView:UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init())
let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init()
В методе (внутри viewDidLoad
)
layout.scrollDirection = UICollectionViewScrollDirection.vertical
alarmCollectionView.setCollectionViewLayout(layout, animated: true)
alarmCollectionView.delegate = self
alarmCollectionView.dataSource = self
alarmCollectionView.backgroundColor = UIColor.clear
self.addSubview(alarmCollectionView)
Хорошо работал после инициализации. Я использую Autolayout, используя CGRect.zero
или использую свой собственный CGRect
UICollectionViewController
. Если вы используете UICollectionViewController
вместо UICollectionView
вам нужно добавить макет при инициализации
let testNavController:UINavigationController = UINavigationController.init()
let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init()
let collectionView:UICollectionViewController = UICollectionViewController.init(collectionViewLayout:layout )
testNavController.pushViewController(collectionView, animated: true)
not setCollectionViewLayout понравилось: [self.collectionView setCollectionViewLayout: flowLayout]; попробуйте установить, когда init: [[UICollectionView alloc] initWithFrame: коллекция кадровViewLayout: defaultLayout];
Только быстрая версия ответа Райли Аврона
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSizeMake(100, 100)
let collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)
self.view.addSubview(collectionView)
collectionView.delegate = self
collectionView.dataSource = self
collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellIdentifier")