Your “page_heading” field is a group field. A group field always has one row even when there is no content entered for the sub fields.
if (have_rows('group_field')) {
// always true
while (have_rows('group_field')) {
// always happens once
}
}
To check for content you must check all of the sub field that need to have content.
if (get_sub_field('sub_field_1') && get_sub_field('sub_field_2') && get_sub_field('sub_field_3')) {
// do something
}